admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/PushController.java
@@ -1,496 +1,541 @@
package com.yeshi.fanli.controller.client.v1;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.activity.ActivityUser;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.dynamic.ImgInfo;
import com.yeshi.fanli.entity.dynamic.ImgInfo.ImgEnum;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.push.DeviceActive;
import com.yeshi.fanli.entity.push.DeviceTokenOPPO;
import com.yeshi.fanli.entity.push.DeviceTokenVIVO;
import com.yeshi.fanli.entity.push.DeviceTokenXM;
import com.yeshi.fanli.entity.push.PushGoods;
import com.yeshi.fanli.entity.push.PushGoodsGroup;
import com.yeshi.fanli.entity.push.PushGoodsRecord;
import com.yeshi.fanli.entity.system.BusinessSystem;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.push.PushGoodsGroupException;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.BusinessSystemService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.push.DeviceActiveService;
import com.yeshi.fanli.service.inter.push.DeviceTokenHWService;
import com.yeshi.fanli.service.inter.push.DeviceTokenOPPOService;
import com.yeshi.fanli.service.inter.push.DeviceTokenVIVOService;
import com.yeshi.fanli.service.inter.push.DeviceTokenXMService;
import com.yeshi.fanli.service.inter.push.IOSPushService;
import com.yeshi.fanli.service.inter.push.PushGoodsGroupService;
import com.yeshi.fanli.service.inter.push.PushGoodsRecordService;
import com.yeshi.fanli.service.inter.push.PushGoodsService;
import com.yeshi.fanli.service.inter.push.PushRecordService;
import com.yeshi.fanli.service.inter.push.PushService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.util.factory.JumpDetailParamsFactory;
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
import com.yeshi.fanli.vo.push.PushRecommendVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping(value = "api/v1/push")
public class PushController {
   @Resource
   private BusinessSystemService businessSystemService;
   @Resource
   private PushRecordService pushRecordService;
   @Resource
   private IOSPushService iosPushService;
   @Resource
   private DeviceTokenHWService deviceTokenHWService;
   @Resource
   private DeviceActiveService deviceActiveService;
   @Resource
   private PushService pushService;
   @Resource
   private PushGoodsService pushGoodsService;
   @Resource
   private PushGoodsGroupService pushGoodsGroupService;
   @Resource
   private PushGoodsRecordService pushGoodsRecordService;
   @Resource
   private JumpDetailV2Service jumpDetailV2Service;
   @Resource
   private ConfigService configService;
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
   @Resource
   private DeviceTokenOPPOService deviceTokenOPPOService;
   @Resource
   private DeviceTokenVIVOService deviceTokenVIVOService;
   @Resource
   private DeviceTokenXMService deviceTokenXMService;
   @Resource
   private GoodsEvaluateService goodsEvaluateService;
   @RequestMapping(value = "callback", method = RequestMethod.POST)
   public void callback(AcceptData acceptData, String pushId, PrintWriter out) {
      BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
            acceptData.getPackages(),acceptData.getSystem());
      if (system == null) {
         out.print(JsonUtil.loadFalseResult("不存在该系统"));
         return;
      }
      int platform = system.getPlatform();
      if (platform == 1) {
         pushRecordService.increaseByAndroid(pushId);
      } else {
         pushRecordService.increaseByIOS(pushId);
      }
      out.print(JsonUtil.loadTrueResult("回调成功"));
   }
   /**
    *
    * 插入苹果推送的deviceToken
    *
    * @author mawurui createTime 2018年5月8日 下午4:15:44
    * @param deviceToken
    */
   @RequestMapping(value = "/insertDeviceToken", method = RequestMethod.POST)
   public void insertIOSDeviceToken(AcceptData acceptData, String deviceToken, PrintWriter out) {
      if (!StringUtil.isNullOrEmpty(acceptData.getDevice()) && !StringUtil.isNullOrEmpty(deviceToken)) {
         // 添加设备活跃记录
         iosPushService.addDeviceToken(null, Integer.parseInt(acceptData.getVersion()), deviceToken,
               acceptData.getDevice());
         out.print(JsonUtil.loadTrue(0, null, "成功"));
      }
   }
   /**
    * IOS推送 方法说明: 将用户id和deviceToken绑定
    *
    * @author mawurui createTime 2018年5月8日 下午4:29:45
    * @param uid
    * @param deviceToken
    */
   @RequestSerializableByKey(key = "#acceptData.device")
   @RequestMapping(value = "/uidBindDeviceToken", method = RequestMethod.POST)
   public void uidBindIOSDeviceToken(AcceptData acceptData, Long uid, String deviceToken, PrintWriter out) {
      if (uid != null && uid != 0 && !StringUtil.isNullOrEmpty(deviceToken)) {
         // 添加token
         iosPushService.addDeviceToken(uid, Integer.parseInt(acceptData.getVersion()), deviceToken,
               acceptData.getDevice());
      }
   }
   /**
    * IOS推送 方法说明: 解绑
    *
    * @author mawurui createTime 2018年5月9日 上午9:49:58
    * @param deviceToken
    */
   @RequestMapping(value = "/unBind", method = RequestMethod.POST)
   public void unBind(AcceptData acceptData, String deviceToken, PrintWriter out) {
      if (!StringUtil.isNullOrEmpty(acceptData.getDevice())) {
         iosPushService.unBindUidAndDevice(acceptData.getDevice());
         out.print(JsonUtil.loadTrue(0, null, "解绑成功"));
      }
   }
   /**
    * 绑定华为推送
    *
    * @param acceptData
    * @param token
    *            -华为token
    * @param uid
    *            -用户ID
    * @param out
    */
   @RequestSerializableByKey(key = "#acceptData.device")
   @RequestMapping(value = "/bindHWPush", method = RequestMethod.POST)
   public void bindHWDeviceToken(AcceptData acceptData, String token, Long uid, PrintWriter out) {
      deviceTokenHWService.addDeviceToken(token, acceptData.getDevice(), uid,
            Integer.parseInt(acceptData.getVersion()));
      out.print(JsonUtil.loadTrueResult("成功"));
   }
   /**
    * 解绑推送
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "/unBindHWPush", method = RequestMethod.POST)
   public void unBindHWDeviceToken(AcceptData acceptData, PrintWriter out) {
      deviceTokenHWService.unBindDeviceToken(acceptData.getDevice());
      out.print(JsonUtil.loadTrueResult("成功"));
   }
   /**
    * 商品推送记录
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "/gethistory", method = RequestMethod.POST)
   public void getHistory(AcceptData acceptData, Long uid, String deviceToken, int page, PrintWriter out) {
      long count = 0;
      JSONArray resultList = new JSONArray();
      DeviceActive deviceActive = deviceActiveService.getDeviceByDeviceAndPlatform(acceptData.getDevice(),
            deviceToken, acceptData.getPlatform());
      if (deviceActive == null) {
         JSONObject resultJson = new JSONObject();
         resultJson.put("count", count);
         resultJson.put("result_list", resultList);
         out.print(JsonUtil.loadTrueResult(resultJson));
         return;
      }
      // 设备注册时间
      Date createTime = deviceActive.getCreateTime();
      count = pushGoodsService.countHistoryByPushTime(uid, createTime,acceptData.getSystem());
      int pageSize = Constant.PAGE_SIZE;
      List<PushGoods> list = pushGoodsService.listHistoryByPushTime((page - 1) * pageSize, pageSize, uid, createTime,acceptData.getSystem());
      if (list == null)
         list = new ArrayList<>();
      for (PushGoods pushGoods : list) {
         Long id = pushGoods.getId();
         PushRecommendVO vo = new PushRecommendVO();
         vo.setTitle(pushGoods.getTitle());
         vo.setContent(pushGoods.getContent());
         vo.setPicture(pushGoods.getPicture());
         vo.setPushtime(pushGoods.getPushTime().getTime());
         Integer scanNum = pushGoods.getScanNum();
         if (scanNum == null) {
//            vo.setScanNum("0");
         } else if (scanNum >= 10000) {
            double num = scanNum;
            String numMidea = String.format("%.1f", num / 10000);
            vo.setScanNum(numMidea + "万");
         } else {
            vo.setScanNum(scanNum +"");
         }
         String params = "";
         String nickName = "";
         JumpDetailV2 jumpDetail = null;
         List<ClientTextStyleVO> totalwords = new ArrayList<ClientTextStyleVO>();
         Integer type = pushGoods.getType();
         if (type == null || type == PushGoods.TYPE_GOODS) {
            long totalgoods = 0;
            CommonGoods goods = null;
            try {
               List<PushGoodsGroup> listGroup = pushGoodsGroupService.getAllInfoByPushId(id);
               if (listGroup != null && listGroup.size() > 0) {
                  totalgoods = listGroup.size();
                  PushGoodsGroup pushGoodsGroup = listGroup.get(0);
                  if (pushGoodsGroup != null) {
                     goods = pushGoodsGroup.getCommonGoods();
                  }
               }
            } catch (PushGoodsGroupException e) {
               e.printStackTrace();
            }
            if (goods != null && StringUtil.isNullOrEmpty(vo.getPicture())) {
               vo.setPicture(TbImgUtil.getTBSize320Img(goods.getPicture()));
            }
            if (totalgoods == 1) {
               params = JumpDetailParamsFactory.createGoodsParams(goods.getGoodsId(), goods.getGoodsType());
               jumpDetail = jumpDetailV2Service.getByTypeCache("goodsdetail",Constant.getPlatformCode(acceptData.getPlatform()),
                     Integer.parseInt(acceptData.getVersion()));
            } else {
               String url = configService.getValue(ConfigKeyEnum.pushGoodsDetails.getKey(),acceptData.getSystem());
               if (url == null) {
                  url = "";
               }
               url = url + "?id=" + id;
               params = JumpDetailParamsFactory.createWEBParams(url);
               jumpDetail = jumpDetailV2Service.getByTypeCache("web",Constant.getPlatformCode(acceptData.getPlatform()),
                     Integer.parseInt(acceptData.getVersion()));
            }
            totalwords.add(new ClientTextStyleVO("本次推荐共", "#666666"));
            totalwords.add(new ClientTextStyleVO(totalgoods + "", "#E5005C"));
            totalwords.add(new ClientTextStyleVO("个商品", "#666666"));
         } else if (type == PushGoods.TYPE_ACTIVITY) {
            GoodsEvaluate goodsEvaluate = goodsEvaluateService.getById(pushGoods.getOtherId());
            if (goodsEvaluate == null) {
               continue;
            }
            ActivityUser user = goodsEvaluate.getUser();
            if (user != null) {
               nickName = user.getNickName();
            }
            if (StringUtil.isNullOrEmpty(vo.getPicture()) && goodsEvaluate.getImgList() != null &&
                  goodsEvaluate.getImgList().size() > 0) {
               for (ImgInfo tmgInfo: goodsEvaluate.getImgList()) {
                  if (tmgInfo.getType() == ImgEnum.img || tmgInfo.getType() == ImgEnum.activity) {
                     vo.setPicture(tmgInfo.getUrl());
                  }
               }
            }
            String url = configService.getValue(ConfigKeyEnum.pushActivityLink.getKey(),acceptData.getSystem());
            if (url == null) {
               url = "";
            }
            url = url + "?id=" + id;
            params = JumpDetailParamsFactory.createWEBParams(url);
            jumpDetail = jumpDetailV2Service.getByTypeCache("web",
                  Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion()));
         } else {
            continue;
         }
         vo.setNickName(nickName);
         vo.setParams(params);
         vo.setJumpDetail(jumpDetail);
         vo.setTotalwords(totalwords);
         resultList.add(vo);
      }
      JSONObject resultJson = new JSONObject();
      resultJson.put("count", count);
      resultJson.put("result_list", resultList);
      out.print(JsonUtil.loadTrueResult(resultJson));
      if (list != null && list.size() > 0 && deviceActive != null) {
         final List<PushGoods> listPush = list;
         // 记录访问信息
         executor.execute(new Runnable() {
            @Override
            public void run() {
               try {
                  Long deviceId = deviceActive.getId();
                  for (PushGoods pushGoods : listPush) {
                     List<PushGoodsRecord> listRecord = pushGoodsRecordService
                           .listByPushIdAndDeviceId(pushGoods.getId(), deviceId);
                     if (listRecord != null && listRecord.size() > 0) {
                        continue; // 已被记录
                     }
                     PushGoodsRecord pushGoodsRecord = new PushGoodsRecord();
                     pushGoodsRecord.setCreateTime(new Date());
                     pushGoodsRecord.setPushGoods(pushGoods);
                     pushGoodsRecord.setDeviceActive(deviceActive);
                     pushGoodsRecordService.insert(pushGoodsRecord);
                  }
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         });
      }
   }
   @RequestMapping("registerOppo")
   public void registerOppo(AcceptData acceptData, String registerId, Long uid, PrintWriter out) {
      DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(acceptData.getDevice());
      if (deviceActive != null) {
         DeviceTokenOPPO oppo = new DeviceTokenOPPO();
         oppo.setDeviceActiveId(deviceActive.getId());
         oppo.setRegisterId(registerId);
         oppo.setUid(uid);
         deviceTokenOPPOService.addDeviceTokenOPPO(oppo);
      }
      out.print(JsonUtil.loadTrueResult(""));
   }
   @RequestMapping("registerVivo")
   public void registerVivo(AcceptData acceptData, String regId, Long uid, PrintWriter out) {
      DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(acceptData.getDevice());
      if (deviceActive != null) {
         DeviceTokenVIVO vivo = new DeviceTokenVIVO();
         vivo.setDeviceActiveId(deviceActive.getId());
         vivo.setRegisterId(regId);
         vivo.setUid(uid);
         deviceTokenVIVOService.addDeviceTokenVIVO(vivo);
      }
      out.print(JsonUtil.loadTrueResult(""));
   }
   @RequestMapping("registerXM")
   public void registerXM(AcceptData acceptData, String regId, Long uid, PrintWriter out) {
      DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(acceptData.getDevice());
      if (deviceActive != null) {
         DeviceTokenXM xm = new DeviceTokenXM();
         xm.setDeviceActiveId(deviceActive.getId());
         xm.setRegisterId(regId);
         xm.setUid(uid);
         deviceTokenXMService.addDeviceToken(xm);
      }
      out.print(JsonUtil.loadTrueResult(""));
   }
   /**
    * 获取推送活动详情
    * @param callback
    * @param acceptData
    * @param uid
    * @param id
    * @param out
    */
   @RequestMapping("getPushDetail")
   public void getPushDetail(String callback, AcceptData acceptData, Long uid, Long id, PrintWriter out) {
      if (uid == null || id == null) {
         JsonUtil.printMode(out, callback,JsonUtil.loadFalseResult("参数不完整"));
         return;
      }
      PushGoods pushGoods = pushGoodsService.selectByPrimaryKey(id);
      if (pushGoods == null || StringUtil.isNullOrEmpty(pushGoods.getOtherId())) {
         JsonUtil.printMode(out, callback,JsonUtil.loadFalseResult("该活动已下架"));
         return;
      }
      GoodsEvaluate goodsEvaluate = goodsEvaluateService.getById(pushGoods.getOtherId());
      if (goodsEvaluate == null) {
         JsonUtil.printMode(out, callback,JsonUtil.loadFalseResult("该活动已下架"));
         return;
      }
      String scanResult = null;
      Integer scanNum = pushGoods.getScanNum();
      if (scanNum == null) {
      } else if (scanNum >= 10000) {
         double num = scanNum;
         String numMidea = String.format("%.1f", num / 10000);
         scanResult = numMidea + "万";
      } else {
         scanResult = scanNum +"";
      }
      String jumpLink = configService.getValue(ConfigKeyEnum.activityDetailLink.getKey(),acceptData.getSystem()) + "?type=%s&id=%s";
      jumpLink = String.format(jumpLink, "circle", goodsEvaluate.getId());
      if (!StringUtil.isNullOrEmpty(goodsEvaluate.getJumpLink())) {
         goodsEvaluate.setJumpLink(jumpLink);
      }
      List<ImgInfo> imgListNew = new ArrayList<>();
      List<ImgInfo> imgList = goodsEvaluate.getImgList();
      if (imgList != null && imgList.size() > 0) {
         for (ImgInfo imgInfo: imgList) {
            if (imgInfo.getType() != ImgEnum.img || imgInfo.getType() == ImgEnum.activity) {
               ImgInfo imgInfoNew = new ImgInfo();
               try {
                  PropertyUtils.copyProperties(imgInfoNew, imgInfo);
               } catch (Exception e) {
                  e.printStackTrace();
                  continue;
               }
               if (!StringUtil.isNullOrEmpty(imgInfoNew.getActivityUrl())) {
                  imgInfoNew.setActivityUrl(jumpLink);
               }
               imgListNew.add(imgInfoNew);
               continue;
            }
            imgListNew.add(imgInfo);
         }
      }
      goodsEvaluate.setImgList(imgListNew);
      GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
      JSONObject json = new JSONObject();
      json.put("title", pushGoods.getTitle());
      json.put("content", pushGoods.getContent());
      json.put("pushTime", TimeUtil.formatDate(pushGoods.getPushTime()));
      json.put("scanNum", scanResult);
      json.put("detailInfo", gsonBuilder.create().toJson(goodsEvaluate));
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(json));
   }
}
package com.yeshi.fanli.controller.client.v1;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.ks.push.pojo.DO.BPushDeviceToken;
import com.ks.push.pojo.DO.PushPlatform;
import com.ks.push.service.BDeviceTokenService;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.activity.ActivityUser;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.dynamic.ImgInfo;
import com.yeshi.fanli.entity.dynamic.ImgInfo.ImgEnum;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.push.DeviceActive;
import com.yeshi.fanli.entity.push.DeviceTokenOPPO;
import com.yeshi.fanli.entity.push.DeviceTokenVIVO;
import com.yeshi.fanli.entity.push.DeviceTokenXM;
import com.yeshi.fanli.entity.push.PushGoods;
import com.yeshi.fanli.entity.push.PushGoodsGroup;
import com.yeshi.fanli.entity.push.PushGoodsRecord;
import com.yeshi.fanli.entity.system.BusinessSystem;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.push.PushGoodsGroupException;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.BusinessSystemService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.push.DeviceActiveService;
import com.yeshi.fanli.service.inter.push.DeviceTokenHWService;
import com.yeshi.fanli.service.inter.push.DeviceTokenOPPOService;
import com.yeshi.fanli.service.inter.push.DeviceTokenVIVOService;
import com.yeshi.fanli.service.inter.push.DeviceTokenXMService;
import com.yeshi.fanli.service.inter.push.IOSPushService;
import com.yeshi.fanli.service.inter.push.PushGoodsGroupService;
import com.yeshi.fanli.service.inter.push.PushGoodsRecordService;
import com.yeshi.fanli.service.inter.push.PushGoodsService;
import com.yeshi.fanli.service.inter.push.PushRecordService;
import com.yeshi.fanli.service.inter.push.PushService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.util.factory.JumpDetailParamsFactory;
import com.yeshi.common.vo.ClientTextStyleVO;
import com.yeshi.fanli.vo.push.PushRecommendVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping(value = "api/v1/push")
public class PushController {
   @Resource
   private BusinessSystemService businessSystemService;
   @Resource
   private PushRecordService pushRecordService;
   @Resource
   private IOSPushService iosPushService;
   @Resource
   private DeviceTokenHWService deviceTokenHWService;
   @Resource
   private DeviceActiveService deviceActiveService;
   @Resource
   private PushService pushService;
   @Resource
   private PushGoodsService pushGoodsService;
   @Resource
   private PushGoodsGroupService pushGoodsGroupService;
   @Resource
   private PushGoodsRecordService pushGoodsRecordService;
   @Resource
   private JumpDetailV2Service jumpDetailV2Service;
   @Resource
   private ConfigService configService;
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
   @Resource
   private DeviceTokenOPPOService deviceTokenOPPOService;
   @Resource
   private DeviceTokenVIVOService deviceTokenVIVOService;
   @Resource
   private DeviceTokenXMService deviceTokenXMService;
   @Resource
   private GoodsEvaluateService goodsEvaluateService;
   @Reference(version = "1.0", check = false)
   private BDeviceTokenService bDeviceTokenService;
   /**
    * 店铺列表
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "bindToken", method = RequestMethod.POST)
   public void bindToken(AcceptData acceptData, Long uid, String type, String token, PrintWriter out) {
      BPushDeviceToken deviceToken = new BPushDeviceToken();
      deviceToken.setAppCode(acceptData.getSystem().name());
      deviceToken.setDeviceId(StringUtil.isNullOrEmpty(acceptData.getUtdid()) ? acceptData.getDevice() : acceptData.getUtdid());
      deviceToken.setBuildModel(acceptData.getDeviceType());
      deviceToken.setBuildVersion(acceptData.getOsVersion());
      deviceToken.setToken(token);
      switch (type) {
         case "huawei":
            type = "hw";
            break;
         case "xiaomi":
            type = "xm";
            break;
         case "meizu":
            type = "mz";
            break;
      }
      deviceToken.setType(PushPlatform.valueOf(type));
      deviceToken.setUid(uid + "");
      deviceToken.setVersionCode(Integer.parseInt(acceptData.getVersion()));
      try {
         bDeviceTokenService.save(deviceToken);
         out.print(JsonUtil.loadTrueResult(""));
      } catch (Exception e) {
         out.print(JsonUtil.loadFalseResult("绑定出错:" + e.getMessage()));
         e.printStackTrace();
      }
   }
   @RequestMapping(value = "callback", method = RequestMethod.POST)
   public void callback(AcceptData acceptData, String pushId, PrintWriter out) {
      BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
            acceptData.getPackages(),acceptData.getSystem());
      if (system == null) {
         out.print(JsonUtil.loadFalseResult("不存在该系统"));
         return;
      }
      int platform = system.getPlatform();
      if (platform == 1) {
         pushRecordService.increaseByAndroid(pushId);
      } else {
         pushRecordService.increaseByIOS(pushId);
      }
      out.print(JsonUtil.loadTrueResult("回调成功"));
   }
   /**
    *
    * 插入苹果推送的deviceToken
    *
    * @author mawurui createTime 2018年5月8日 下午4:15:44
    * @param deviceToken
    */
   @RequestMapping(value = "/insertDeviceToken", method = RequestMethod.POST)
   public void insertIOSDeviceToken(AcceptData acceptData, String deviceToken, PrintWriter out) {
      if (!StringUtil.isNullOrEmpty(acceptData.getDevice()) && !StringUtil.isNullOrEmpty(deviceToken)) {
         // 添加设备活跃记录
         iosPushService.addDeviceToken(null, Integer.parseInt(acceptData.getVersion()), deviceToken,
               acceptData.getDevice());
         out.print(JsonUtil.loadTrue(0, null, "成功"));
      }
   }
   /**
    * IOS推送 方法说明: 将用户id和deviceToken绑定
    *
    * @author mawurui createTime 2018年5月8日 下午4:29:45
    * @param uid
    * @param deviceToken
    */
   @RequestSerializableByKey(key = "#acceptData.device")
   @RequestMapping(value = "/uidBindDeviceToken", method = RequestMethod.POST)
   public void uidBindIOSDeviceToken(AcceptData acceptData, Long uid, String deviceToken, PrintWriter out) {
      if (uid != null && uid != 0 && !StringUtil.isNullOrEmpty(deviceToken)) {
         // 添加token
         iosPushService.addDeviceToken(uid, Integer.parseInt(acceptData.getVersion()), deviceToken,
               acceptData.getDevice());
      }
   }
   /**
    * IOS推送 方法说明: 解绑
    *
    * @author mawurui createTime 2018年5月9日 上午9:49:58
    * @param deviceToken
    */
   @RequestMapping(value = "/unBind", method = RequestMethod.POST)
   public void unBind(AcceptData acceptData, String deviceToken, PrintWriter out) {
      if (!StringUtil.isNullOrEmpty(acceptData.getDevice())) {
         iosPushService.unBindUidAndDevice(acceptData.getDevice());
         out.print(JsonUtil.loadTrue(0, null, "解绑成功"));
      }
   }
   /**
    * 绑定华为推送
    *
    * @param acceptData
    * @param token
    *            -华为token
    * @param uid
    *            -用户ID
    * @param out
    */
   @RequestSerializableByKey(key = "#acceptData.device")
   @RequestMapping(value = "/bindHWPush", method = RequestMethod.POST)
   public void bindHWDeviceToken(AcceptData acceptData, String token, Long uid, PrintWriter out) {
      deviceTokenHWService.addDeviceToken(token, acceptData.getDevice(), uid,
            Integer.parseInt(acceptData.getVersion()));
      out.print(JsonUtil.loadTrueResult("成功"));
   }
   /**
    * 解绑推送
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "/unBindHWPush", method = RequestMethod.POST)
   public void unBindHWDeviceToken(AcceptData acceptData, PrintWriter out) {
      deviceTokenHWService.unBindDeviceToken(acceptData.getDevice());
      out.print(JsonUtil.loadTrueResult("成功"));
   }
   /**
    * 商品推送记录
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "/gethistory", method = RequestMethod.POST)
   public void getHistory(AcceptData acceptData, Long uid, String deviceToken, int page, PrintWriter out) {
      long count = 0;
      JSONArray resultList = new JSONArray();
      DeviceActive deviceActive = deviceActiveService.getDeviceByDeviceAndPlatform(acceptData.getDevice(),
            deviceToken, acceptData.getPlatform());
      if (deviceActive == null) {
         JSONObject resultJson = new JSONObject();
         resultJson.put("count", count);
         resultJson.put("result_list", resultList);
         out.print(JsonUtil.loadTrueResult(resultJson));
         return;
      }
      // 设备注册时间
      Date createTime = deviceActive.getCreateTime();
      count = pushGoodsService.countHistoryByPushTime(uid, createTime,acceptData.getSystem());
      int pageSize = Constant.PAGE_SIZE;
      List<PushGoods> list = pushGoodsService.listHistoryByPushTime((page - 1) * pageSize, pageSize, uid, createTime,acceptData.getSystem());
      if (list == null)
         list = new ArrayList<>();
      for (PushGoods pushGoods : list) {
         Long id = pushGoods.getId();
         PushRecommendVO vo = new PushRecommendVO();
         vo.setTitle(pushGoods.getTitle());
         vo.setContent(pushGoods.getContent());
         vo.setPicture(pushGoods.getPicture());
         vo.setPushtime(pushGoods.getPushTime().getTime());
         Integer scanNum = pushGoods.getScanNum();
         if (scanNum == null) {
//            vo.setScanNum("0");
         } else if (scanNum >= 10000) {
            double num = scanNum;
            String numMidea = String.format("%.1f", num / 10000);
            vo.setScanNum(numMidea + "万");
         } else {
            vo.setScanNum(scanNum +"");
         }
         String params = "";
         String nickName = "";
         JumpDetailV2 jumpDetail = null;
         List<ClientTextStyleVO> totalwords = new ArrayList<ClientTextStyleVO>();
         Integer type = pushGoods.getType();
         if (type == null || type == PushGoods.TYPE_GOODS) {
            long totalgoods = 0;
            CommonGoods goods = null;
            try {
               List<PushGoodsGroup> listGroup = pushGoodsGroupService.getAllInfoByPushId(id);
               if (listGroup != null && listGroup.size() > 0) {
                  totalgoods = listGroup.size();
                  PushGoodsGroup pushGoodsGroup = listGroup.get(0);
                  if (pushGoodsGroup != null) {
                     goods = pushGoodsGroup.getCommonGoods();
                  }
               }
            } catch (PushGoodsGroupException e) {
               e.printStackTrace();
            }
            if (goods != null && StringUtil.isNullOrEmpty(vo.getPicture())) {
               vo.setPicture(TbImgUtil.getTBSize320Img(goods.getPicture()));
            }
            if (totalgoods == 1) {
               params = JumpDetailParamsFactory.createGoodsParams(goods.getGoodsId(), goods.getGoodsType());
               jumpDetail = jumpDetailV2Service.getByTypeCache("goodsdetail",Constant.getPlatformCode(acceptData.getPlatform()),
                     Integer.parseInt(acceptData.getVersion()),acceptData.getSystem());
            } else {
               String url = configService.getValue(ConfigKeyEnum.pushGoodsDetails.getKey(),acceptData.getSystem());
               if (url == null) {
                  url = "";
               }
               url = url + "?id=" + id;
               params = JumpDetailParamsFactory.createWEBParams(url);
               jumpDetail = jumpDetailV2Service.getByTypeCache("web",Constant.getPlatformCode(acceptData.getPlatform()),
                     Integer.parseInt(acceptData.getVersion()),acceptData.getSystem());
            }
            totalwords.add(new ClientTextStyleVO("本次推荐共", "#666666"));
            totalwords.add(new ClientTextStyleVO(totalgoods + "", "#E5005C"));
            totalwords.add(new ClientTextStyleVO("个商品", "#666666"));
         } else if (type == PushGoods.TYPE_ACTIVITY) {
            GoodsEvaluate goodsEvaluate = goodsEvaluateService.getById(pushGoods.getOtherId());
            if (goodsEvaluate == null) {
               continue;
            }
            ActivityUser user = goodsEvaluate.getUser();
            if (user != null) {
               nickName = user.getNickName();
            }
            if (StringUtil.isNullOrEmpty(vo.getPicture()) && goodsEvaluate.getImgList() != null &&
                  goodsEvaluate.getImgList().size() > 0) {
               for (ImgInfo tmgInfo: goodsEvaluate.getImgList()) {
                  if (tmgInfo.getType() == ImgEnum.img || tmgInfo.getType() == ImgEnum.activity) {
                     vo.setPicture(tmgInfo.getUrl());
                  }
               }
            }
            String url = configService.getValue(ConfigKeyEnum.pushActivityLink.getKey(),acceptData.getSystem());
            if (url == null) {
               url = "";
            }
            url = url + "?id=" + id;
            params = JumpDetailParamsFactory.createWEBParams(url);
            jumpDetail = jumpDetailV2Service.getByTypeCache("web",
                  Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion()),acceptData.getSystem());
         } else {
            continue;
         }
         vo.setNickName(nickName);
         vo.setParams(params);
         vo.setJumpDetail(jumpDetail);
         vo.setTotalwords(totalwords);
         resultList.add(vo);
      }
      JSONObject resultJson = new JSONObject();
      resultJson.put("count", count);
      resultJson.put("result_list", resultList);
      out.print(JsonUtil.loadTrueResult(resultJson));
      if (list != null && list.size() > 0 && deviceActive != null) {
         final List<PushGoods> listPush = list;
         // 记录访问信息
         executor.execute(new Runnable() {
            @Override
            public void run() {
               try {
                  Long deviceId = deviceActive.getId();
                  for (PushGoods pushGoods : listPush) {
                     List<PushGoodsRecord> listRecord = pushGoodsRecordService
                           .listByPushIdAndDeviceId(pushGoods.getId(), deviceId);
                     if (listRecord != null && listRecord.size() > 0) {
                        continue; // 已被记录
                     }
                     PushGoodsRecord pushGoodsRecord = new PushGoodsRecord();
                     pushGoodsRecord.setCreateTime(new Date());
                     pushGoodsRecord.setPushGoods(pushGoods);
                     pushGoodsRecord.setDeviceActive(deviceActive);
                     pushGoodsRecordService.insert(pushGoodsRecord);
                  }
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         });
      }
   }
   @RequestMapping("registerOppo")
   public void registerOppo(AcceptData acceptData, String registerId, Long uid, PrintWriter out) {
      DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(acceptData.getDevice());
      if (deviceActive != null) {
         DeviceTokenOPPO oppo = new DeviceTokenOPPO();
         oppo.setDeviceActiveId(deviceActive.getId());
         oppo.setRegisterId(registerId);
         oppo.setUid(uid);
         deviceTokenOPPOService.addDeviceTokenOPPO(oppo);
      }
      out.print(JsonUtil.loadTrueResult(""));
   }
   @RequestMapping("registerVivo")
   public void registerVivo(AcceptData acceptData, String regId, Long uid, PrintWriter out) {
      DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(acceptData.getDevice());
      if (deviceActive != null) {
         DeviceTokenVIVO vivo = new DeviceTokenVIVO();
         vivo.setDeviceActiveId(deviceActive.getId());
         vivo.setRegisterId(regId);
         vivo.setUid(uid);
         deviceTokenVIVOService.addDeviceTokenVIVO(vivo);
      }
      out.print(JsonUtil.loadTrueResult(""));
   }
   @RequestMapping("registerXM")
   public void registerXM(AcceptData acceptData, String regId, Long uid, PrintWriter out) {
      DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(acceptData.getDevice());
      if (deviceActive != null) {
         DeviceTokenXM xm = new DeviceTokenXM();
         xm.setDeviceActiveId(deviceActive.getId());
         xm.setRegisterId(regId);
         xm.setUid(uid);
         deviceTokenXMService.addDeviceToken(xm);
      }
      out.print(JsonUtil.loadTrueResult(""));
   }
   /**
    * 获取推送活动详情
    * @param callback
    * @param acceptData
    * @param uid
    * @param id
    * @param out
    */
   @RequestMapping("getPushDetail")
   public void getPushDetail(String callback, AcceptData acceptData, Long uid, Long id, PrintWriter out) {
      if (uid == null || id == null) {
         JsonUtil.printMode(out, callback,JsonUtil.loadFalseResult("参数不完整"));
         return;
      }
      PushGoods pushGoods = pushGoodsService.selectByPrimaryKey(id);
      if (pushGoods == null || StringUtil.isNullOrEmpty(pushGoods.getOtherId())) {
         JsonUtil.printMode(out, callback,JsonUtil.loadFalseResult("该活动已下架"));
         return;
      }
      GoodsEvaluate goodsEvaluate = goodsEvaluateService.getById(pushGoods.getOtherId());
      if (goodsEvaluate == null) {
         JsonUtil.printMode(out, callback,JsonUtil.loadFalseResult("该活动已下架"));
         return;
      }
      String scanResult = null;
      Integer scanNum = pushGoods.getScanNum();
      if (scanNum == null) {
      } else if (scanNum >= 10000) {
         double num = scanNum;
         String numMidea = String.format("%.1f", num / 10000);
         scanResult = numMidea + "万";
      } else {
         scanResult = scanNum +"";
      }
      String jumpLink = configService.getValue(ConfigKeyEnum.activityDetailLink.getKey(),acceptData.getSystem()) + "?type=%s&id=%s";
      jumpLink = String.format(jumpLink, "circle", goodsEvaluate.getId());
      if (!StringUtil.isNullOrEmpty(goodsEvaluate.getJumpLink())) {
         goodsEvaluate.setJumpLink(jumpLink);
      }
      List<ImgInfo> imgListNew = new ArrayList<>();
      List<ImgInfo> imgList = goodsEvaluate.getImgList();
      if (imgList != null && imgList.size() > 0) {
         for (ImgInfo imgInfo: imgList) {
            if (imgInfo.getType() != ImgEnum.img || imgInfo.getType() == ImgEnum.activity) {
               ImgInfo imgInfoNew = new ImgInfo();
               try {
                  PropertyUtils.copyProperties(imgInfoNew, imgInfo);
               } catch (Exception e) {
                  e.printStackTrace();
                  continue;
               }
               if (!StringUtil.isNullOrEmpty(imgInfoNew.getActivityUrl())) {
                  imgInfoNew.setActivityUrl(jumpLink);
               }
               imgListNew.add(imgInfoNew);
               continue;
            }
            imgListNew.add(imgInfo);
         }
      }
      goodsEvaluate.setImgList(imgListNew);
      GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
      JSONObject json = new JSONObject();
      json.put("title", pushGoods.getTitle());
      json.put("content", pushGoods.getContent());
      json.put("pushTime", TimeUtil.formatDate(pushGoods.getPushTime()));
      json.put("scanNum", scanResult);
      json.put("detailInfo", gsonBuilder.create().toJson(goodsEvaluate));
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(json));
   }
}