yujian
2020-04-02 0ec22dcf4fd9c4496e6f681e7fab89f56c6e4e8a
fanli/src/main/java/com/yeshi/fanli/service/impl/push/HWPushServiceImpl.java
@@ -1,28 +1,29 @@
package com.yeshi.fanli.service.impl.push;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.yeshi.fanli.controller.admin.PushController;
import com.yeshi.fanli.entity.bus.user.AccountMessage;
import com.yeshi.fanli.dto.push.PushTypeEnum;
import com.yeshi.fanli.entity.AppVersionInfo;
import com.yeshi.fanli.entity.bus.user.UserCustomSettings;
import com.yeshi.fanli.entity.bus.user.UserCustomSettings.UserSettingTypeEnum;
import com.yeshi.fanli.entity.push.DeviceTokenHW;
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.PushException;
import com.yeshi.fanli.exception.push.PushException;
import com.yeshi.fanli.log.PushLogHelper;
import com.yeshi.fanli.service.inter.config.AppVersionService;
import com.yeshi.fanli.service.inter.push.DeviceTokenHWService;
import com.yeshi.fanli.service.inter.push.HWPushService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.service.inter.user.UserCustomSettingsService;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.push.HWPushUtil;
import net.sf.json.JSONObject;
@Service
public class HWPushServiceImpl implements HWPushService {
@@ -30,204 +31,209 @@
   @Resource
   private DeviceTokenHWService deviceTokenHWService;
   @Resource
   private AppVersionService appVersionService;
   @Resource
   private UserCustomSettingsService userCustomSettingsService;
   private List<Integer> getVersionCodeList(List<Integer> versionCodeList) {
      List<Integer> versionList = new ArrayList<>();
      if (versionCodeList == null) {// 全推
         List<AppVersionInfo> appInfoList = appVersionService.listByPlatformAndMinVersionCode("android", 46);
         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;
   }
   @Async("pushExecutor")
   @Override
   public void pushGoods(Long uid, Long auctionId, String title, String content, String versions) throws PushException {
      String gid = auctionId + "";
      JSONObject json = new JSONObject();
      json.put("url", "");
      json.put("id", gid);
      json.put("type", "goodsdetail");
      json.put("miPushUrl", String.format("%s.ui.recommend.GoodsBrowserActivity",
            Constant.systemCommonConfig.getAndroidBaseactivityName()));
      if (uid == null || uid == 0) {
         // 华为全推送 --暂时设置推送100000用户
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenList(1, 100000);
         ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
               while (hwDeviceList != null && hwDeviceList.size() > 0) {
                  List<String> deviceTokens = new ArrayList<>();
                  if (hwDeviceList.size() > 10000) {
                     List<DeviceTokenHW> pushList = hwDeviceList.subList(0, 1000);
                     for (DeviceTokenHW DeviceTokenHW : pushList) {
                        deviceTokens.add(DeviceTokenHW.getDeviceToken());
                        hwDeviceList.remove(DeviceTokenHW);
                     }
                  } else {
                     for (DeviceTokenHW DeviceTokenHW : hwDeviceList) {
                        deviceTokens.add(DeviceTokenHW.getDeviceToken());
                        hwDeviceList.remove(DeviceTokenHW);
                     }
                  }
                  try {
                     HWPushUtil.pushGoods(deviceTokens, title, content, 1, Long.parseLong(gid));
                  } catch (Exception e) {
                     PushLogHelper.hwError(e);
                  }
   public void pushGoods(Long uid, Long auctionId, String title, String content, List<Integer> versionCodeList)
         throws PushException {
      push(PushTypeEnum.goodsdetail, uid, title, content, null, null, auctionId, versionCodeList);
   }
   @Async("pushExecutor")
   @Override
   public void pushUrl(Long uid, String url, String title, String content, List<Integer> versionCodeList)
         throws PushException {
      push(PushTypeEnum.url, uid, title, content, null, url, null, versionCodeList);
   }
   @Async("pushExecutor")
   @Override
   public void pushZNX(Long uid, String title, String content, List<Integer> versionCodeList) throws PushException {
      push(PushTypeEnum.ZNX, uid, title, content, null, null, null, versionCodeList);
   }
   @Async("pushExecutor")
   @Override
   public void pushWEEX(Long uid, String title, String content, String weexUrl, List<Integer> versionCodeList)
         throws PushException {
      push(PushTypeEnum.weex, uid, title, content, weexUrl, null, null, versionCodeList);
   }
   @Async("pushExecutor")
   @Override
   public void pushBaiChuanUrl(Long uid, String title, String content, String url, List<Integer> versionCodeList)
         throws PushException {
      push(PushTypeEnum.baichuan, uid, title, content, null, url, null, versionCodeList);
   }
   @Async("pushExecutor")
   @Override
   public void pushWelfareCenter(Long uid, String title, String content, List<Integer> versionCodeList)
         throws PushException {
      push(PushTypeEnum.welfare, uid, title, content, null, null, null, versionCodeList);
   }
   @Override
   public void pushUserSignInNotification(Long uid, String title, String content, List<Integer> versionCodeList)
         throws PushException {
      push(PushTypeEnum.signin, uid, title, content, null, null, null, versionCodeList);
   }
   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;
   }
   /**
    * 推送
    *
    * @param type
    * @param uid
    * @param title
    * @param content
    * @param url
    * @param webUrl
    * @param versionCodeList
    */
   private void push(PushTypeEnum type, Long uid, String title, String content, String url, String webUrl,
         Long goodsId, List<Integer> versionCodeList) throws PushException {
      int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
      List<Integer> newVersionList = getVersionCodeList(versionCodeList);
      // 1.6.5后开始推送
      for (int i = 0; i < newVersionList.size(); i++) {
         if (newVersionList.get(i) < 47)
            newVersionList.remove(i--);
      }
      if (uid == null || uid == 0) {
         long deviceCount = deviceTokenHWService.countDeviceToken(newVersionList);
         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);
            hwDeviceList = filterDeviceToken(hwDeviceList, hour);
            List<String> tokenList = new ArrayList<>();
            for (DeviceTokenHW token : hwDeviceList)
               tokenList.add(token.getDeviceToken());
            try {
               if (type == PushTypeEnum.goodsdetail) {// 商品详情
                  if (goodsId == null)
                     throw new PushException(2, "参数不完整");
                  HWPushUtil.pushGoods(tokenList, title, content, 1, goodsId);
               } else if (type == PushTypeEnum.url) {// 链接
                  if (StringUtil.isNullOrEmpty(webUrl))
                     throw new PushException(2, "参数不完整");
                  HWPushUtil.pushUrl(tokenList, title, content, webUrl);
               } else if (type == PushTypeEnum.ZNX) {// 站内信
                  HWPushUtil.pushZNX(tokenList, title, content);
               } else if (type == PushTypeEnum.weex) {// weex
                  if (StringUtil.isNullOrEmpty(url))
                     throw new PushException(2, "参数不完整");
                  HWPushUtil.pushWEEX(tokenList, title, content, url);
               } else if (type == PushTypeEnum.baichuan) {// 百川链接
                  if (StringUtil.isNullOrEmpty(webUrl))
                     throw new PushException(2, "参数不完整");
                  HWPushUtil.pushBaiChuanUrl(tokenList, title, content, webUrl);
               } else if (type == PushTypeEnum.welfare) {// 福利中心
                  HWPushUtil.pushWelfareCenter(tokenList, title, content);
               } else if (type == PushTypeEnum.signin) {// 签到
                  HWPushUtil.pushUserSignInNotification(tokenList, title, content);
               }
            } catch (Exception e) {
               PushLogHelper.hwError(e);
            }
         }
      } else {
         // 华为单推
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenByUid(uid);
         if (hwDeviceList != null && hwDeviceList.size() > 0) {
            List<String> deviceList = new ArrayList<>();
            for (DeviceTokenHW dt : hwDeviceList)
               deviceList.add(dt.getDeviceToken());
            try {
               HWPushUtil.pushGoods(deviceList, title, content, 1, Long.parseLong(gid));
            } catch (Exception e) {
               PushLogHelper.hwError(e);
            }
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenByUid(uid, newVersionList);
         List<String> tokenList = new ArrayList<>();
         if (hwDeviceList != null) {
            hwDeviceList = filterDeviceToken(hwDeviceList, hour);
            for (DeviceTokenHW token : hwDeviceList)
               tokenList.add(token.getDeviceToken());
         }
         if (tokenList.size() == 0)
            return;
         try {
            if (type == PushTypeEnum.goodsdetail) {// 商品详情
               if (goodsId == null)
                  throw new PushException(2, "参数不完整");
               HWPushUtil.pushGoods(tokenList, title, content, 1, goodsId);
            } else if (type == PushTypeEnum.url) {// 链接
               if (StringUtil.isNullOrEmpty(webUrl))
                  throw new PushException(2, "参数不完整");
               HWPushUtil.pushUrl(tokenList, title, content, webUrl);
            } else if (type == PushTypeEnum.ZNX) {// 站内信
               HWPushUtil.pushZNX(tokenList, title, content);
            } else if (type == PushTypeEnum.weex) {// weex
               if (StringUtil.isNullOrEmpty(url))
                  throw new PushException(2, "参数不完整");
               HWPushUtil.pushWEEX(tokenList, title, content, url);
            } else if (type == PushTypeEnum.baichuan) {// 百川链接
               if (StringUtil.isNullOrEmpty(webUrl))
                  throw new PushException(2, "参数不完整");
               HWPushUtil.pushBaiChuanUrl(tokenList, title, content, webUrl);
            } else if (type == PushTypeEnum.welfare) {// 福利中心
               HWPushUtil.pushWelfareCenter(tokenList, title, content);
            } else if (type == PushTypeEnum.signin) {// 签到
               HWPushUtil.pushUserSignInNotification(tokenList, title, content);
            }
         } catch (Exception e) {
            PushLogHelper.hwError(e);
         }
      }
   }
   @Async("pushExecutor")
   @Override
   public void pushUrl(Long uid, String url, String title, String content, String versions) 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();
      pushRecord.setState(1);
      pushRecord.setType(PushController.URL);
      pushRecord.setUrl(url);
      pushRecord.setTitle(title);
      pushRecord.setAppName(Constant.systemCommonConfig.getProjectChineseName());
      // 华为全推送 --暂时设置推送100000用户
      if (uid == null || uid == 0) {
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenList(1, 100000);
         ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
               while (hwDeviceList != null && hwDeviceList.size() > 0) {
                  List<String> deviceTokens = new ArrayList<>();
                  if (hwDeviceList.size() > 1000) {
                     List<DeviceTokenHW> pushList = hwDeviceList.subList(0, 1000);
                     for (DeviceTokenHW DeviceTokenHW : pushList) {
                        deviceTokens.add(DeviceTokenHW.getDeviceToken());
                        hwDeviceList.remove(DeviceTokenHW);
                     }
                  } else {
                     for (DeviceTokenHW DeviceTokenHW : hwDeviceList) {
                        deviceTokens.add(DeviceTokenHW.getDeviceToken());
                        hwDeviceList.remove(DeviceTokenHW);
                     }
                  }
                  try {
                     HWPushUtil.pushWeb(deviceTokens, title, content, url);
                  } catch (Exception e) {
                     PushLogHelper.hwError(e);
                  }
               }
            }
         });
      } else {
         // 华为单推
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenByUid(uid);
         if (hwDeviceList != null && hwDeviceList.size() > 0) {
            List<String> deviceList = new ArrayList<>();
            for (DeviceTokenHW dt : hwDeviceList)
               deviceList.add(dt.getDeviceToken());
            try {
               HWPushUtil.pushWeb(deviceList, title, content, url);
            } catch (Exception e) {
               PushLogHelper.hwError(e);
            }
         }
      }
   }
   @Async("pushExecutor")
   @Override
   public void pushZNX(Long uid, AccountMessage msg, SystemZnx systemZNX, String versions) throws PushException {
      JSONObject contentJson = new JSONObject();
      contentJson.put("isOpen", 0);
      contentJson.put("createTime", java.lang.System.currentTimeMillis());
      if (systemZNX != null) {
         // 华为全推送 --暂时设置推送10000用户
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenList(1, 10000);
         ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
               while (hwDeviceList != null && hwDeviceList.size() > 0) {
                  List<String> deviceTokens = new ArrayList<>();
                  if (hwDeviceList.size() > 1000) {
                     List<DeviceTokenHW> pushList = hwDeviceList.subList(0, 1000);
                     for (DeviceTokenHW DeviceTokenHW : pushList) {
                        deviceTokens.add(DeviceTokenHW.getDeviceToken());
                        hwDeviceList.remove(DeviceTokenHW);
                     }
                  } else {
                     for (DeviceTokenHW DeviceTokenHW : hwDeviceList) {
                        deviceTokens.add(DeviceTokenHW.getDeviceToken());
                        hwDeviceList.remove(DeviceTokenHW);
                     }
                  }
                  try {
                     HWPushUtil.pushZNX(deviceTokens, systemZNX.getTitle(), systemZNX.getContent());
                  } catch (Exception e) {
                     PushLogHelper.hwError(e);
                  }
               }
            }
         });
      } else if (msg != null) {
         // 华为单推
         List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenByUid(uid);
         if (hwDeviceList != null && hwDeviceList.size() > 0) {
            List<String> deviceList = new ArrayList<>();
            for (DeviceTokenHW dt : hwDeviceList)
               deviceList.add(dt.getDeviceToken());
            try {
               HWPushUtil.pushZNX(deviceList, msg.getTitle(), msg.getContent());
            } catch (Exception e) {
               PushLogHelper.hwError(e);
            }
         }
      }
   }
   @Async("pushExecutor")
   @Override
   public void pushWEEX(Long uid, String title, String content, String weexUrl, String versions) throws PushException {
      // TODO 推送weex页面
   }
   @Async("pushExecutor")
   @Override
   public void pushBaiChuanUrl(Long uid, String title, String content, String url, String versions) throws PushException {
      // TODO 推送淘客百川链接
   }
   @Async("pushExecutor")
   @Override
   public void pushWelfareCenter(Long uid, String title, String content, String versions) throws PushException {
      // TODO Auto-generated method stub
   }
}