package com.yeshi.fanli.controller.client; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.yeshi.utils.HttpUtil; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.taobao.TbImgUtil; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.share.UserShareGoodsGroup; import com.yeshi.fanli.entity.bus.share.UserShareGoodsHistory; import com.yeshi.fanli.entity.bus.share.UserShareGoodsRecord; import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoBaoLink; import com.yeshi.fanli.entity.taobao.TaoKeAppInfo; import com.yeshi.fanli.exception.ShareGoodsException; import com.yeshi.fanli.exception.goods.ShareGoodsTextTemplateException; import com.yeshi.fanli.exception.share.UserShareGoodsRecordException; import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException; import com.yeshi.fanli.service.inter.config.ConfigService; import com.yeshi.fanli.service.inter.goods.CommonGoodsService; import com.yeshi.fanli.service.inter.goods.ShareGoodsService; import com.yeshi.fanli.service.inter.goods.ShareGoodsTextTemplateService; import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService; import com.yeshi.fanli.service.inter.monitor.MonitorService; import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService; import com.yeshi.fanli.service.inter.user.UserInfoService; import com.yeshi.fanli.service.inter.user.UserShareGoodsGroupService; import com.yeshi.fanli.service.inter.user.UserShareGoodsRecordService; import com.yeshi.fanli.util.AESUtil; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TaoBaoConstant; import com.yeshi.fanli.util.cache.TaoBaoGoodsCacheUtil; import com.yeshi.fanli.util.factory.MonitorFactory; import com.yeshi.fanli.util.taobao.TaoBaoUtil; import com.yeshi.fanli.util.taobao.TaoKeApiUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @Controller(value = "ShareController1") @RequestMapping("api/v1/share") public class ShareController { @Resource private ShareGoodsService shareGoodsService; @Resource private ConfigService configService; @Resource private HongBaoManageService hongBaoManageService; @Resource private MonitorService monitorService; @Resource private UserShareGoodsRecordService userShareGoodsRecordService; @Resource private UserShareGoodsGroupService userShareGoodsGroupService; @Resource private CommonGoodsService commonGoodsService; @Resource private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService; @Resource private UserInfoService userInfoService; @Resource private TaoBaoGoodsCacheUtil taoBaoGoodsCacheUtil; @Resource private RedisManager redisManager; @Resource private ShareGoodsTextTemplateService shareGoodsTextTemplateService; // 获取商品分享链接 @RequestMapping(value = "getGoodsShareUrl") public void getGoodsShareUrl(AcceptData acceptData, long id, PrintWriter out) { out.print(JsonUtil .loadTrueResult(String.format("%s?id=" + id, Constant.systemCommonConfig.getAppShareInfoUrl()))); } /** * 获取淘宝的分享链接 * * @param acceptData * @param uid * -用户ID * @param auctionId-商品ID * @param out */ @RequestMapping(value = "gettaobaosharelink") public void getTaobaoShareLink(AcceptData acceptData, Long uid, Long auctionId, HttpServletRequest request, PrintWriter out) { if (uid == null || uid <= 0) { out.print(JsonUtil.loadFalseResult(1, "用户ID不能为空")); return; } UserInfo user = userInfoService.getUserByIdWithMybatis(uid); if (user != null && user.getState() != UserInfo.STATE_NORMAL) { out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC)); return; } if (auctionId == null || auctionId <= 0) { out.print(JsonUtil.loadFalseResult(2, "商品ID不能为空")); return; } UserExtraTaoBaoInfo extraInfo = userExtraTaoBaoInfoService.getByUid(uid); try { String relationId = null; if (extraInfo != null && extraInfo.getRelationId() != null && extraInfo.getRelationValid() != null && extraInfo.getRelationValid() == true) relationId = extraInfo.getRelationId(); TaoBaoLink taoBaoLink = shareGoodsService.getTaoBaoLinkForShare(uid, auctionId, relationId); JSONObject data = new JSONObject(); String url = String.format("http://%s%s?uid=%s&id=%s&appType=flq", configService.getH5Host(), Constant.systemCommonConfig.getShareGoodsPagePath(), AESUtil.encrypt(uid + "", Constant.UIDAESKEY), auctionId + ""); String shortLink = HttpUtil.getShortLink(url); if (!StringUtil.isNullOrEmpty(shortLink)) { url = shortLink; } data.put("clickUrl", url); data.put("token", taoBaoLink.getTaoToken()); data.put("rule", "http://apph5.yeshitv.com/apppage/all_help_content.html?id=148&from=singlemessage&isappinstalled=0"); data.put("pictUrl", TbImgUtil.getTBSizeImg(taoBaoLink.getGoods().getPictUrl(), 500)); String shareText = ""; // 无券 String shopType = taoBaoLink.getGoods().getUserType() == 0 ? "淘宝价" : "天猫价"; if (StringUtil.isNullOrEmpty(taoBaoLink.getGoods().getCouponInfo())) { String text = shareGoodsTextTemplateService.getCommonTemplate(uid); if (StringUtil.isNullOrEmpty(text)) text = configService.get("goods_share_text_nocoupon"); shareText = text.replace("{标题}", taoBaoLink.getGoods().getTitle()).replace("{商品原价}", MoneyBigDecimalUtil.getWithNoZera(taoBaoLink.getGoods().getZkPrice()) + ""); } else// 有券 { String text = shareGoodsTextTemplateService.geteCouponTemplate(uid); if (StringUtil.isNullOrEmpty(text)) text = configService.get("goods_share_text_coupon"); shareText = text.replace("{标题}", taoBaoLink.getGoods().getTitle()) .replace("{商品原价}", MoneyBigDecimalUtil.getWithNoZera(taoBaoLink.getGoods().getZkPrice()) + "") .replace("{优惠券面额}", MoneyBigDecimalUtil.getWithNoZera(taoBaoLink.getGoods().getCouponAmount()).toString()) .replace("{优惠券价}", TaoBaoUtil.getAfterUseCouplePrice(taoBaoLink.getGoods()) + ""); } shareText = shareText.replace("{店铺类型}", shopType) .replace("{月销量}", TaoBaoUtil.getSaleCount(taoBaoLink.getGoods().getBiz30day())) .replace("{领券短链}", shortLink).replace("{淘口令}", taoBaoLink.getTaoToken()); data.put("shareText", shareText); String descText = shareText.replace(taoBaoLink.getGoods().getTitle(), "").trim(); if (descText.startsWith("\\r\\n")) descText = descText.substring(0); data.put("descText", descText); // String imgs = configService.get("goods_share_notify_imgs"); JSONArray array = JSONArray.fromObject(imgs); int p = (int) (array.size() * Math.random()); if (p < array.size()) data.put("notifyPicture", array.optString(p)); data.put("notifyDesc", configService.get("goods_share_notify")); // 添加分享记录 BigDecimal rate = hongBaoManageService.getShareRate(); UserShareGoodsHistory history = new UserShareGoodsHistory(); history.setTkCode(taoBaoLink.getTaoToken()); history.setLink(taoBaoLink.getClickUrl()); history.setQuanLink(taoBaoLink.getCouponLink()); history.setCreateTime(new Date()); history.setGoodsId(taoBaoLink.getGoods().getAuctionId()); history.setGoodsType(UserShareGoodsHistory.TYPE_TAOBAO); history.setHongbao(TaoBaoUtil.getShareGoodsHongBaoInfo(taoBaoLink.getGoods(), rate)); List imgList = taoBaoLink.getGoods().getImgList(); if (imgList == null) { imgList = new ArrayList<>(); } history.setPictures(JsonUtil.getGson().toJson(imgList)); history.setUser(new UserInfo(uid)); history.setPostPicture(taoBaoLink.getGoods().getPictUrl()); data.put("shareMoney", "¥" + history.getHongbao().toString()); out.print(JsonUtil.loadTrueResult(data)); // 异步操作 com.yeshi.fanli.util.ThreadUtil.run(new Runnable() { @Override public void run() { shareGoodsService.addShareGoodsHistory(history); } }); return; } catch (ShareGoodsException e) { try { monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, e.getCode(), 0, "分享出错")); } catch (Exception e1) { } out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMessage())); } } /** * 分享记录统计列表 * * @param acceptData * @param page * 初始1 * @param uid * @param source * @param out */ @RequestMapping(value = "getlistrecord", method = RequestMethod.POST) public void getListRecord(AcceptData acceptData, Integer page, Long uid, String source, PrintWriter out) { if (page == null || page < 1) { out.print(JsonUtil.loadFalseResult("页码不正确")); } if (uid == null) { out.print(JsonUtil.loadFalseResult("用户未登录")); } if ("all".equals(source)) { source = null;// 查询全部 } try { int pageSize = Constant.PAGE_SIZE; JSONObject data = new JSONObject(); List list = new ArrayList(); long count = userShareGoodsRecordService.countQueryByUid(uid, source); if (count > 0) { list = userShareGoodsRecordService.getMyShareGoodsRecords((page - 1) * pageSize, pageSize, uid, source); } data.put("count", count); data.put("result_list", list); out.print(JsonUtil.loadTrueResult(data)); } catch (Exception e) { out.print(JsonUtil.loadFalseResult("加载失败")); e.printStackTrace(); } } /** * 获取分享商品 * * @param acceptData * @param recordId * @param out */ @RequestMapping(value = "getrecordgoods", method = RequestMethod.POST) public void getRecordGoods(AcceptData acceptData, Long recordId, PrintWriter out) { if (recordId == null) { out.print(JsonUtil.loadFalseResult("参数不正确")); } try { JSONObject data = userShareGoodsRecordService.getGoodsGroup(recordId); out.print(JsonUtil.loadTrueResult(data)); } catch (Exception e) { out.print(JsonUtil.loadFalseResult("加载失败")); e.printStackTrace(); } } /** * 获取分享商品单个统计信息 * * @param acceptData * @param groupId * @param out */ @RequestMapping(value = "getgoodsdata", method = RequestMethod.POST) public void getGoodsData(AcceptData acceptData, Long groupId, PrintWriter out) { if (groupId == null) { out.print(JsonUtil.loadFalseResult("参数不正确")); } try { UserShareGoodsGroup userShareGoodsGroup = userShareGoodsGroupService.selectByPrimaryKey(groupId); if (userShareGoodsGroup != null) { userShareGoodsGroup.setBrowseTime(null); userShareGoodsGroup.setCreateTime(null); userShareGoodsGroup.setUpdateTime(null); userShareGoodsGroup.setRecordId(null); } JSONObject data = new JSONObject(); data.put("goodsData", userShareGoodsGroup); out.print(JsonUtil.loadTrueResult(data)); } catch (Exception e) { out.print(JsonUtil.loadFalseResult("加载失败")); e.printStackTrace(); } } /** * 商品详情分享 * * @param acceptData * @param uid * 用户id * @param auctionId * 商品id * @param type * 图片分享类型 单图single 多图many * @param out */ @RequestMapping(value = "sharedetail", method = RequestMethod.POST) public void shareDetail(AcceptData acceptData, Long uid, Long auctionId, String type, PrintWriter out) { try { userShareGoodsRecordService.saveDetail(uid, auctionId, type); out.print(JsonUtil.loadTrueResult("分享成功")); } catch (UserShareGoodsRecordException e) { out.print(JsonUtil.loadFalseResult(e.getMsg())); e.printStackTrace(); } catch (Exception e) { out.print(JsonUtil.loadFalseResult("加载失败")); e.printStackTrace(); } } /** * 更新分享记录 * * @param acceptData * @param shareId * @param out */ @RequestMapping(value = "updaterecord", method = RequestMethod.POST) public void updateRecord(AcceptData acceptData, Long shareId, PrintWriter out) { if (shareId == null) { out.print(JsonUtil.loadFalseResult("参数不正确")); } try { userShareGoodsRecordService.updateShareRecord(shareId); out.print(JsonUtil.loadTrueResult("")); } catch (UserShareGoodsRecordException e) { out.print(JsonUtil.loadFalseResult(e.getMsg())); e.printStackTrace(); } catch (Exception e) { out.print(JsonUtil.loadFalseResult("加载失败")); e.printStackTrace(); } } /** * 预览分享模板 * * @param acceptData * @param uid * @param template * @param goodsId * @param hasCoupon * @param out */ @RequestMapping(value = "viewShareTextTemplate", method = RequestMethod.POST) public void preViewShareTextTemplate(AcceptData acceptData, Long uid, String template, Long goodsId, Boolean hasCoupon, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (goodsId == null) { out.print(JsonUtil.loadFalseResult(3, "商品ID不能为空")); return; } TaoBaoGoodsBrief goods = taoBaoGoodsCacheUtil.getCommonTaoBaoGoodsInfo(goodsId); if (goods == null) try { goods = redisManager.getTaoBaoGoodsBrief(goodsId); } catch (TaobaoGoodsDownException e) { goods = null; } if (goods == null) { out.print(JsonUtil.loadFalseResult(4, "商品已下架")); return; } if (StringUtil.isNullOrEmpty(template)) template = getShareTemplate(uid, hasCoupon); // 校验券模板是否正确 if (hasCoupon) { // 有券商品 try { shareGoodsTextTemplateService.isCouponTemplateRight(template); } catch (ShareGoodsTextTemplateException e) { out.print(JsonUtil.loadFalseResult(5, e.getMsg())); return; } } else { // 普通商品 try { shareGoodsTextTemplateService.isCommonTemplateRight(template); } catch (ShareGoodsTextTemplateException e) { out.print(JsonUtil.loadFalseResult(5, e.getMsg())); return; } } // 查询是否有分享 UserShareGoodsHistory userShareHistory = shareGoodsService.getShareGoodsHistory(uid, goods.getAuctionId()); String url = String.format("http://%s%s?uid=%s&id=%s&appType=flq", configService.getH5Host(), Constant.systemCommonConfig.getShareGoodsPagePath(), AESUtil.encrypt(uid + "", Constant.UIDAESKEY), goods.getAuctionId() + ""); String shortLink = HttpUtil.getShortLink(url); String token = ""; if (userShareHistory != null) { token = userShareHistory.getTkCode(); } if (StringUtil.isNullOrEmpty(token)) { TaoKeAppInfo app = new TaoKeAppInfo(); app.setAdzoneId(TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT.split("_")[3]); app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY); app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET); app.setPid(TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT); TaoBaoGoodsBrief goodsLink = TaoKeApiUtil.specialConvertCoupon(goods.getAuctionId(), app); if (goodsLink != null) token = TaoKeApiUtil.getTKToken(goods.getPictUrl(), goods.getTitle(), StringUtil.isNullOrEmpty(goodsLink.getCouponLink()) ? goodsLink.getAuctionUrl() : goodsLink.getCouponLink()); } String content = shareGoodsTextTemplateService.createContentByTemplate(template, uid, goods, token, shortLink, hasCoupon); JSONObject data = new JSONObject(); data.put("content", content); out.print(JsonUtil.loadTrueResult(data)); } /** * 保存模板 * * @param acceptData * @param uid * @param hasCoupon * @param template * @param out */ @RequestMapping(value = "saveShareTextTemplate", method = RequestMethod.POST) public void saveShareTextTemplate(AcceptData acceptData, Long uid, Boolean hasCoupon, String template, PrintWriter out) { if (StringUtil.isNullOrEmpty(template)) { out.print(JsonUtil.loadFalseResult(1, "分享模板为空")); return; } // 校验券模板是否正确 if (hasCoupon) { // 有券商品 try { shareGoodsTextTemplateService.isCouponTemplateRight(template); shareGoodsTextTemplateService.saveCouponTemplate(uid, template); out.print(JsonUtil.loadTrueResult("")); } catch (ShareGoodsTextTemplateException e) { out.print(JsonUtil.loadFalseResult(5, e.getMsg())); return; } } else { // 普通商品 try { shareGoodsTextTemplateService.isCommonTemplateRight(template); shareGoodsTextTemplateService.saveCommonTemplate(uid, template); out.print(JsonUtil.loadTrueResult("")); } catch (ShareGoodsTextTemplateException e) { out.print(JsonUtil.loadFalseResult(5, e.getMsg())); return; } } } /** * 还原模板 * * @param acceptData * @param uid * @param hasCoupon * -是否有券 * @param out */ @RequestMapping(value = "resetShareTextTemplate", method = RequestMethod.POST) public void resetShareTextTemplate(AcceptData acceptData, Long uid, Long goodsId, Boolean hasCoupon, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } if (hasCoupon) { shareGoodsTextTemplateService.resetCouponTemplate(uid); } else { shareGoodsTextTemplateService.resetCommonTemplate(uid); } if (goodsId != null) { preViewShareTextTemplate(acceptData, uid, null, goodsId, hasCoupon, out); return; } out.print(JsonUtil.loadTrueResult("")); } private String getShareTemplate(Long uid, boolean hasCoupon) { if (hasCoupon) { String template = shareGoodsTextTemplateService.geteCouponTemplate(uid); if (StringUtil.isNullOrEmpty(template)) template = configService.get("goods_share_text_coupon"); return template; } else { String template = shareGoodsTextTemplateService.getCommonTemplate(uid); if (StringUtil.isNullOrEmpty(template)) template = configService.get("goods_share_text_nocoupon"); return template; } } /** * 获取分享模板 * * @param acceptData * @param uid * @param hasCoupon * @param out */ @RequestMapping(value = "getShareTextTemplate", method = RequestMethod.POST) public void getShareTextTemplate(AcceptData acceptData, Long uid, Boolean hasCoupon, PrintWriter out) { if (uid == null) { out.print(JsonUtil.loadFalseResult(1, "用户未登录")); return; } JSONObject data = new JSONObject(); data.put("template", getShareTemplate(uid, hasCoupon)); out.print(JsonUtil.loadTrueResult(data)); } /** * 获取分享模板编辑规则 * * @param acceptData * @param out */ @RequestMapping(value = "getShareTextTemplateRules", method = RequestMethod.POST) public void getShareTextTemplateRules(AcceptData acceptData, PrintWriter out) { out.print(JsonUtil.loadTrueResult(configService.get("share_goods_template_rules"))); } }