package com.yeshi.fanli.controller.client; import java.io.PrintWriter; import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.yeshi.utils.BigDecimalUtil; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.taobao.TbImgUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.lable.QualityFactory; import com.yeshi.fanli.entity.bus.msg.MsgAccountDetail; import com.yeshi.fanli.entity.bus.msg.MsgInviteDetail; import com.yeshi.fanli.entity.bus.msg.MsgMoneyDetail; import com.yeshi.fanli.entity.bus.msg.MsgOrderDetail; import com.yeshi.fanli.entity.bus.msg.UserMsgUnReadNum; import com.yeshi.fanli.entity.bus.msg.UserSystemMsg; import com.yeshi.fanli.entity.goods.CommonGoods; import com.yeshi.fanli.entity.goods.RecommendUserGoods; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult; import com.yeshi.fanli.exception.goods.CommonGoodsException; import com.yeshi.fanli.exception.goods.RecommendUserGoodsException; import com.yeshi.fanli.exception.msg.UserSystemMsgException; import com.yeshi.fanli.service.inter.goods.CommonGoodsService; import com.yeshi.fanli.service.inter.goods.RecommendUserGoodsService; import com.yeshi.fanli.service.inter.lable.QualityFactoryService; import com.yeshi.fanli.service.inter.msg.MsgAccountDetailService; import com.yeshi.fanli.service.inter.msg.MsgInviteDetailService; import com.yeshi.fanli.service.inter.msg.MsgMoneyDetailService; import com.yeshi.fanli.service.inter.msg.MsgOrderDetailService; import com.yeshi.fanli.service.inter.msg.UserMsgReadStateService; import com.yeshi.fanli.service.inter.msg.UserSystemMsgService; import com.yeshi.fanli.service.inter.user.UserInfoService; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TimeUtil; import com.yeshi.fanli.util.factory.CommonGoodsFactory; import com.yeshi.fanli.util.factory.msg.UserMsgVOFactory; import com.yeshi.fanli.util.taobao.TaoKeApiUtil; import com.yeshi.fanli.vo.msg.UserHomeMsgVO; import com.yeshi.fanli.vo.msg.UserMsgVO; import com.yeshi.fanli.vo.msg.UserSystemMsgVO; import net.sf.json.JSONObject; @Controller @RequestMapping("api/v1/user/msg") public class UserMsgController { @Resource private MsgOrderDetailService msgOrderDetailService; @Resource private MsgMoneyDetailService msgMoneyDetailService; @Resource private MsgInviteDetailService msgInviteDetailService; @Resource private MsgAccountDetailService msgAccountDetailService; @Resource private UserMsgReadStateService userMsgReadStateService; @Resource private RecommendUserGoodsService recommendUserGoodsService; @Resource private UserInfoService userInfoService; @Resource private UserSystemMsgService userSystemMsgService; @Resource private CommonGoodsService commonGoodsService; @Resource private QualityFactoryService qualityFactoryService; // 消息的类型 final static String MSG_TYPE_ORDER = "order"; final static String MSG_TYPE_MONEY = "money"; final static String MSG_TYPE_ACCOUNT = "account"; final static String MSG_TYPE_INVITE = "invite"; /** * 获取订单消息列表 * * @param acceptData * @param uid * @param page * @param out */ @RequestMapping(value = "getMsgList", method = RequestMethod.POST) public void getOrderMsgList(AcceptData acceptData, Long uid, int page, String type, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (StringUtil.isNullOrEmpty(type)) { out.print(JsonUtil.loadFalseResult(2, "请上传type")); return; } List list = new ArrayList<>(); long count = 0; switch (type) { case MSG_TYPE_ORDER: userMsgReadStateService.readOrderMsg(uid); List detailList = msgOrderDetailService.listMsgOrderDetail(uid, page); count = msgOrderDetailService.countMsgOrderDetail(uid); if (detailList != null) for (MsgOrderDetail detail : detailList) list.add(UserMsgVOFactory.create(detail)); break; case MSG_TYPE_MONEY: userMsgReadStateService.readMoneyMsg(uid); List detailList1 = msgMoneyDetailService.listMsgMoneyDetail(uid, page); count = msgMoneyDetailService.countMsgMoneyDetail(uid); if (detailList1 != null) for (MsgMoneyDetail detail : detailList1) list.add(UserMsgVOFactory.create(detail)); break; case MSG_TYPE_ACCOUNT: userMsgReadStateService.readAccountMsg(uid); List detailList2 = msgAccountDetailService.listMsgAccountDetail(uid, page); count = msgAccountDetailService.countMsgAccountDetail(uid); if (detailList2 != null) for (MsgAccountDetail detail : detailList2) list.add(UserMsgVOFactory.create(detail)); break; case MSG_TYPE_INVITE: userMsgReadStateService.readInviteMsg(uid); List detailList3 = msgInviteDetailService.listMsgInviteDetail(uid, page); count = msgInviteDetailService.countMsgInviteDetail(uid); if (detailList3 != null) for (MsgInviteDetail detail : detailList3) list.add(UserMsgVOFactory.create(detail)); break; } GsonBuilder builder = new GsonBuilder(); builder = getTimeDescJsonBuilder(builder); JSONObject root = new JSONObject(); root.put("data", builder.create().toJson(list)); root.put("count", count); out.print(JsonUtil.loadTrueResult(root)); } /** * 获取消息未读数 * * @param acceptData * @param uid * @param out */ @RequestMapping(value = "getUnReadMsgCount", method = RequestMethod.POST) public void getUnReadMsgCount(AcceptData acceptData, Long uid, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } UserMsgUnReadNum num = userMsgReadStateService.getReadStateByUid(uid); JSONObject data = JSONObject.fromObject(JsonUtil.getApiCommonGson().toJson(num)); data.put("totalCount", num.getTypeAccount() + num.getTypeInvite() + num.getTypeMoney() + num.getTypeOrder() + num.getTypeScore() + num.getTypeSystem()); out.print(JsonUtil.loadTrueResult(data)); } private String getTimeDesc(Date nowDate, Date targetDate) { Calendar now = Calendar.getInstance(); now.setTime(nowDate); if (TimeUtil.getGernalTime(targetDate.getTime(), "yyyy-MM-dd") .equalsIgnoreCase(TimeUtil.getGernalTime(now.getTimeInMillis(), "yyyy-MM-dd"))) { return "今天 " + TimeUtil.getGernalTime(targetDate.getTime(), "HH:mm"); } else if (TimeUtil.getGernalTime(targetDate.getTime(), "yyyy-MM-dd") .equalsIgnoreCase(TimeUtil.getGernalTime(now.getTimeInMillis() - 1000 * 60 * 60 * 24L, "yyyy-MM-dd"))) { return "昨天 " + TimeUtil.getGernalTime(targetDate.getTime(), "HH:mm"); } else { return TimeUtil.getGernalTime(targetDate.getTime(), "yyyy.MM.dd HH:mm"); } } private GsonBuilder getTimeDescJsonBuilder(GsonBuilder builder) { builder = builder.registerTypeAdapter(Date.class, new JsonSerializer() { @Override public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) { if (value == null) { return new JsonPrimitive(""); } else { Calendar now = Calendar.getInstance(); return new JsonPrimitive(getTimeDesc(new Date(now.getTimeInMillis()), value)); } } }).registerTypeAdapter(BigDecimal.class, new JsonSerializer() { @Override public JsonElement serialize(BigDecimal value, Type theType, JsonSerializationContext context) { if (value == null) { return new JsonPrimitive("0"); } else { return new JsonPrimitive(BigDecimalUtil.getWithNoZera(value).toString()); } } }); return builder; } private void addRecommendGoods(Long uid, String imei, String idfa) { TaoBaoSearchResult result = TaoKeApiUtil.guessDeviceLike(1, 50, imei, idfa); if (result != null && result.getTaoBaoGoodsBriefs() != null) { for (int i = 0; i < result.getTaoBaoGoodsBriefs().size(); i++) { if (result.getTaoBaoGoodsBriefs().get(i).getCouponAmount() == null || result.getTaoBaoGoodsBriefs().get(i).getCouponAmount().compareTo(new BigDecimal(0)) <= 0) { result.getTaoBaoGoodsBriefs().remove(i); i--; } } // 随机几个 int count = (int) (Math.random() * 3) + 1; Set positionList = new HashSet<>(); for (int i = 0; i < count; i++) if (result.getTaoBaoGoodsBriefs().size() > 0) { positionList.add((int) (result.getTaoBaoGoodsBriefs().size() * Math.random())); } if (positionList != null && positionList.size() > 0) { List goodsList = new ArrayList<>(); for (Integer p : positionList) { TaoBaoGoodsBrief goodsB = result.getTaoBaoGoodsBriefs().get(p); try { CommonGoods cgoods = commonGoodsService .addOrUpdateCommonGoods(CommonGoodsFactory.create(goodsB)); goodsList.add(cgoods); } catch (CommonGoodsException e) { e.printStackTrace(); } } try { recommendUserGoodsService.addRecommend(uid, "", goodsList); } catch (RecommendUserGoodsException e) { e.printStackTrace(); } } } } private void addRecommendGoods(Long uid) { List qfList = qualityFactoryService.listByMinSalesCountOrderByCreateTimeDesc(10000, 1, 20); if (qfList != null && qfList != null) { for (int i = 0; i < qfList.size(); i++) { if (qfList.get(i).getTaoBaoGoodsBrief().getCouponAmount() == null || qfList.get(i).getTaoBaoGoodsBrief().getCouponAmount().compareTo(new BigDecimal(0)) <= 0) { qfList.remove(i); i--; } } // 随机几个 int count = (int) (Math.random() * 3) + 1; Set positionList = new HashSet<>(); for (int i = 0; i < count; i++) if (qfList.size() > 0) { positionList.add((int) (qfList.size() * Math.random())); } if (positionList != null && positionList.size() > 0) { List goodsList = new ArrayList<>(); for (Integer p : positionList) { TaoBaoGoodsBrief goodsB = qfList.get(p).getTaoBaoGoodsBrief(); try { CommonGoods cgoods = commonGoodsService .addOrUpdateCommonGoods(CommonGoodsFactory.create(goodsB)); goodsList.add(cgoods); } catch (CommonGoodsException e) { e.printStackTrace(); } } try { recommendUserGoodsService.addRecommend(uid, "", goodsList); } catch (RecommendUserGoodsException e) { e.printStackTrace(); } } } } /** * 获取首页消息 * * @param acceptData * @param uid * @param page * @param out */ @RequestMapping(value = "getHomeMsgList", method = RequestMethod.POST) public void getHomeMsgList(AcceptData acceptData, Long uid, int page, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (page == 1) { boolean canAdd = false; int hour = Calendar.getInstance().get(Calendar.HOUR); RecommendUserGoods goods = recommendUserGoodsService.getLatestRecommendUserGoods(uid); if (goods == null) { canAdd = true; } else { // 是否和上次间隔时间足够 if (System.currentTimeMillis() - goods.getCreateTime().getTime() >= 1000 * 60 * 60 * 8L) { canAdd = true; } } if (canAdd) { if (hour < 12) addRecommendGoods(uid); else addRecommendGoods(uid, acceptData.getImei(), acceptData.getIdfa()); } } List volist = new ArrayList<>(); List list = recommendUserGoodsService.listRecommend(uid, page, Constant.PAGE_SIZE); long count = recommendUserGoodsService.countRecommend(uid) + 1;// 计算欢迎语的数量 Date now = new Date(); for (RecommendUserGoods goods : list) { UserHomeMsgVO vo = new UserHomeMsgVO(); vo.setContent(goods.getRecommendDesc()); vo.setCreateTime(getTimeDesc(now, goods.getCreateTime())); if (goods.getGoodsList().size() == 1) vo.setType(UserHomeMsgVO.TYPE_GOODS_1); else if (goods.getGoodsList().size() == 2) vo.setType(UserHomeMsgVO.TYPE_GOODS_2); else if (goods.getGoodsList().size() == 3) vo.setType(UserHomeMsgVO.TYPE_GOODS_3); List goodsList = new ArrayList<>(); for (CommonGoods cg : goods.getGoodsList()) { if (goods.getGoodsList().size() == 1) cg.setPicture(TbImgUtil.getTBSizeImg(cg.getPicture(), 400)); else if (goods.getGoodsList().size() == 2) cg.setPicture(TbImgUtil.getTBSizeImg(cg.getPicture(), 320)); else if (goods.getGoodsList().size() == 3) cg.setPicture(TbImgUtil.getTBSizeImg(cg.getPicture(), 220)); TaoBaoGoodsBrief tbGoods = new TaoBaoGoodsBrief(); if (cg.getCouponAmount() == null) tbGoods.setCouponAmount(new BigDecimal(0)); else tbGoods.setCouponAmount(cg.getCouponAmount()); tbGoods.setAuctionId(cg.getGoodsId()); tbGoods.setPictUrl(cg.getPicture()); goodsList.add(tbGoods); } vo.setGoodsList(goodsList); vo.setTitle("猜你喜欢"); vo.setIcon("http://img.flqapp.com/resource/msg/icon_msg_guess_like.png"); volist.add(vo); } if (volist.size() > 0 && volist.size() < Constant.PAGE_SIZE) { // 添加欢迎语 UserHomeMsgVO vo = new UserHomeMsgVO(); vo.setContent("恭喜你,成为返利券的用户\n独家优惠券帮你省钱;\n参与奖金活动帮你赚钱;\n让返利券成为你的省钱助手吧!"); vo.setTitle("新人欢迎"); vo.setCreateTime(getTimeDesc(now, new Date(userInfoService.getUserById(uid).getCreatetime()))); vo.setType(UserHomeMsgVO.TYPE_WELCOME); volist.add(vo); } JSONObject root = new JSONObject(); root.put("msgList", new Gson().toJson(volist)); if (page == 1) { UserMsgUnReadNum num = userMsgReadStateService.getReadStateByUid(uid); UserSystemMsg usm = userSystemMsgService.getLatestUserSystemMsg(uid); if (usm != null) root.put("systemMsg", new UserSystemMsgVO(usm.getId(), usm.getType().name(), usm.getSolved(), usm.getTitle(), usm.getContent(), usm.getTimeTag() == 1 ? "http://img.flqapp.com/resource/msg/icon_emergent.png" : "", "http://img.flqapp.com/resource/msg/icon_msg_system.png", getTimeDesc(now, usm.getCreateTime()), num.getTypeSystem())); } root.put("count", count); out.print(JsonUtil.loadTrueResult(root)); } /** * 获取系统消息列表 * * @param acceptData * @param uid * @param page * @param out */ @RequestMapping(value = "getSystemMsgList", method = RequestMethod.POST) public void getSystemMsgList(AcceptData acceptData, Long uid, int page, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } List voList = new ArrayList<>(); List list = userSystemMsgService.listUserSystemMsg(uid, page, Constant.PAGE_SIZE); if (list != null) for (UserSystemMsg usm : list) { voList.add(new UserSystemMsgVO(usm.getId(), usm.getType().name(), usm.getSolved(), usm.getTitle(), usm.getContent(), usm.getTimeTag() == 1 ? "http://img.flqapp.com/resource/msg/icon_emergent.png" : "", null, usm.getCreateTime().getTime() + "", 0)); } long count = userSystemMsgService.countUserSystemMsg(uid); userMsgReadStateService.readUserSystemMsg(uid); JSONObject root = new JSONObject(); root.put("data", voList); root.put("count", count); out.print(JsonUtil.loadTrueResult(root)); } /** * 设置问题已经解决 * * @param acceptData * @param uid * @param id * @param out */ @RequestMapping(value = "setSystemMsgSolved", method = RequestMethod.POST) public void setSystemMsgSolved(AcceptData acceptData, Long uid, Long id, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (id == null) { out.print(JsonUtil.loadFalseResult(2, "消息ID为空")); return; } try { userSystemMsgService.setSystemMsgSolved(uid, id); out.print(JsonUtil.loadTrueResult("")); } catch (UserSystemMsgException e) { out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg())); } } @RequestMapping(value = "setAllMsgRead", method = RequestMethod.POST) public void setAllMsgRead(AcceptData acceptData, Long uid, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } userMsgReadStateService.setAllMsgRead(uid); out.print(JsonUtil.loadTrueResult("")); } }