package com.yeshi.fanli.service.impl.user; import java.io.InputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.transaction.Transactional; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Service; import org.yeshi.utils.DateUtil; import org.yeshi.utils.HttpUtil; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.QRCodeUtil; import org.yeshi.utils.entity.FileUploadResult; import org.yeshi.utils.exception.HttpException; import org.yeshi.utils.taobao.TbImgUtil; import org.yeshi.utils.tencentcloud.COSManager; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.yeshi.fanli.dao.mybatis.UserInfoMapper; import com.yeshi.fanli.dao.mybatis.share.UserShareGoodsRecordMapper; import com.yeshi.fanli.entity.bus.share.UserShareGoodsGroup; import com.yeshi.fanli.entity.bus.share.UserShareGoodsRecord; import com.yeshi.fanli.entity.bus.share.UserShareGoodsRecord.ShareSourceTypeEnum; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.goods.CommonGoods; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBriefExtra; import com.yeshi.fanli.exception.goods.CommonGoodsException; import com.yeshi.fanli.exception.share.UserShareGoodsRecordException; import com.yeshi.fanli.exception.taobao.TaoKeApiException; 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.hongbao.HongBaoManageService; import com.yeshi.fanli.service.inter.user.UserAccountService; import com.yeshi.fanli.service.inter.user.UserGoodsStorageService; 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.ImageUtil; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.factory.CommonGoodsFactory; import com.yeshi.fanli.util.taobao.TaoBaoUtil; import com.yeshi.fanli.util.taobao.TaoKeApiUtil; @Service public class UserShareGoodsRecordServiceImpl implements UserShareGoodsRecordService { @Resource(name = "taskExecutor") private TaskExecutor executor; @Resource private ConfigService configService; @Resource private RedisManager redisManager; @Resource private UserInfoMapper userInfoMapper; @Resource private UserAccountService userAccountService; @Resource private UserShareGoodsRecordMapper userShareGoodsRecordMapper; @Resource private CommonGoodsService commonGoodsService; @Resource private UserShareGoodsGroupService userShareGoodsGroupService; @Resource private HongBaoManageService hongBaoManageService; @Resource private UserGoodsStorageService userGoodsStorageService; @Override public int insert(UserShareGoodsRecord record) { return userShareGoodsRecordMapper.insert(record); } @Override public int insertSelective(UserShareGoodsRecord record) { return userShareGoodsRecordMapper.insertSelective(record); } @Override public UserShareGoodsRecord selectByPrimaryKey(Long id) { return userShareGoodsRecordMapper.selectByPrimaryKey(id); } @Override public int updateByPrimaryKeySelective(UserShareGoodsRecord record) { return userShareGoodsRecordMapper.updateByPrimaryKeySelective(record); } @Override public List listQueryByUid(long start, int count, Long uid, String source) { return userShareGoodsRecordMapper.listQueryByUid(start, count, uid, source); } @Override public long countQueryByUid(Long uid, String source) { return userShareGoodsRecordMapper.countQueryByUid(uid, source); } @Override public List listCountRecord(List list) { return userShareGoodsRecordMapper.listCountRecord(list); } @Override public List getMyShareGoodsRecords(long start, int count, Long uid, String source) { List list = listQueryByUid(start, count, uid, source); if (list == null) { list = new ArrayList(); } if (list.size() > 0) { List listId = new ArrayList(); for (UserShareGoodsRecord userShareGoodsRecord : list) { userShareGoodsRecord.setShareTime(userShareGoodsRecord.getUpdateTime().getTime()); userShareGoodsRecord.setCreateTime(null); userShareGoodsRecord.setUpdateTime(null); listId.add(userShareGoodsRecord.getId()); // 改变图片尺寸 String pictUrl = userShareGoodsRecord.getPicture(); if (!StringUtil.isNullOrEmpty(pictUrl) && !pictUrl.contains("320x320")) { userShareGoodsRecord.setPicture(TbImgUtil.getTBSize320Img(pictUrl)); } } // 今日浏览统计 List listTodayBrowse = userShareGoodsRecordMapper.listCountTodayBrowse(listId); // 订单、浏览数量、金额统计 List listCountRecord = listCountRecord(listId); if ((listCountRecord != null && listCountRecord.size() > 0) || (listTodayBrowse != null && listTodayBrowse.size() > 0)) { for (UserShareGoodsRecord shareRecord : list) { Long id = shareRecord.getId(); if (listTodayBrowse != null && listTodayBrowse.size() > 0) { for (UserShareGoodsRecord goodsRecord : listTodayBrowse) { Long recordId = goodsRecord.getId(); if (id == recordId || id.equals(recordId)) { shareRecord.setTodayBrowse(goodsRecord.getTodayBrowse()); break; } } } if (listCountRecord != null && listCountRecord.size() > 0) { for (UserShareGoodsRecord goodsRecord : listCountRecord) { Long recordId = goodsRecord.getId(); if (id == recordId || id.equals(recordId)) { shareRecord.setTotalBrowse(goodsRecord.getTotalBrowse()); shareRecord.setTotalOrder(goodsRecord.getTotalOrder()); BigDecimal totalMoney = goodsRecord.getTotalMoney(); if (totalMoney != null && totalMoney.compareTo(new BigDecimal(0)) > 0) { shareRecord.setTotalMoney(goodsRecord.getTotalMoney()); } else { shareRecord.setTotalMoney(goodsRecord.getRevenueMoney()); } shareRecord.setRevenueMoney(null); Integer totalGoods = goodsRecord.getTotalGoods(); shareRecord.setTotalGoods(totalGoods); if (totalGoods > 1) { shareRecord.setShareType(UserShareGoodsRecord.SHARETYPE_GROUP); } else { shareRecord.setShareType(UserShareGoodsRecord.SHARETYPE_SINGLE); } break; } } } } } } return list; } @Override public void saveDetail(Long uid, Long auctionId, String type) throws UserShareGoodsRecordException { if (auctionId == null) { throw new UserShareGoodsRecordException(1, "分享商品不能为空"); } if (uid == null) { throw new UserShareGoodsRecordException(1, "用户ID不能为空"); } TaoBaoGoodsBrief goodsBrief = null; try { goodsBrief = redisManager.getTaoBaoGoodsBrief(auctionId); } catch (TaobaoGoodsDownException e) { throw new UserShareGoodsRecordException(1, "商品已下架"); } UserShareGoodsRecord userShareGoodsRecord = new UserShareGoodsRecord(); userShareGoodsRecord.setUid(uid); userShareGoodsRecord.setSource(ShareSourceTypeEnum.goodsDetail); userShareGoodsRecord.setShareState(1);// 已分享成功 // 单个商品分享 singleGoodsShare(userShareGoodsRecord, goodsBrief); } @Override public void save(Long uid, ShareSourceTypeEnum source, String title, TaoBaoGoodsBrief taoBaoGoodsBrief) throws UserShareGoodsRecordException { if (taoBaoGoodsBrief == null) { throw new UserShareGoodsRecordException(1, "分享商品不能为空"); } if (uid == null) { throw new UserShareGoodsRecordException(1, "用户ID不能为空"); } if (source == null) { throw new UserShareGoodsRecordException(1, "分享来源不能为空"); } UserShareGoodsRecord userShareGoodsRecord = new UserShareGoodsRecord(); userShareGoodsRecord.setUid(uid); userShareGoodsRecord.setSource(source); userShareGoodsRecord.setTitle(title); // 单个商品分享 singleGoodsShare(userShareGoodsRecord, taoBaoGoodsBrief); } /** * 保存分享记录 * * @param userShareGoodsRecord * 分享记录: uid、picture、source 为必输入 * @throws UserShareGoodsRecordException */ @Override public Map save(Long uid, ShareSourceTypeEnum source, String title, List listGoods) throws UserShareGoodsRecordException { if (listGoods == null || listGoods.size() < 0) { throw new UserShareGoodsRecordException(1, "分享商品数量不足"); } if (uid == null) { throw new UserShareGoodsRecordException(1, "用户ID不能为空"); } if (source == null) { throw new UserShareGoodsRecordException(1, "分享来源不能为空"); } UserShareGoodsRecord userShareGoodsRecord = new UserShareGoodsRecord(); userShareGoodsRecord.setUid(uid); userShareGoodsRecord.setSource(source); userShareGoodsRecord.setTitle(title); // 取一个商品图片作为主图 userShareGoodsRecord.setPicture(listGoods.get(0).getPictUrl()); Date date = new Date(); userShareGoodsRecord.setShareState(0); // 初始未分享 userShareGoodsRecord.setCreateTime(date); userShareGoodsRecord.setUpdateTime(date); userShareGoodsRecordMapper.insertSelective(userShareGoodsRecord); Map map = new HashMap(); // 多个商品分享 FileUploadResult loadResult = multipleGoodsShare(userShareGoodsRecord, listGoods); map.put("loadResult", loadResult); map.put("shareId", userShareGoodsRecord.getId()); return map; } /** * 单个商品分享生成记录 * * @param userShareGoodsRecord * @param taoBaoGoodsBrief */ @Transactional public void singleGoodsShare(UserShareGoodsRecord userShareGoodsRecord, TaoBaoGoodsBrief taoBaoGoodsBrief) { CommonGoods commonGoods = CommonGoodsFactory.create(taoBaoGoodsBrief); commonGoods.setState(taoBaoGoodsBrief.getState()); try { CommonGoods resultCommonGoods = commonGoodsService.addOrUpdateCommonGoods(commonGoods); if (resultCommonGoods == null) { return; } UserShareGoodsGroup singleGoods = userShareGoodsGroupService.getSingleGoods(resultCommonGoods.getId(), userShareGoodsRecord.getUid()); if (singleGoods != null) { // 单个商品多次分享 userShareGoodsRecord.setPicture(taoBaoGoodsBrief.getPictUrl()); userShareGoodsRecord.setId(singleGoods.getRecordId()); userShareGoodsRecord.setUpdateTime(new Date()); userShareGoodsRecordMapper.updateByPrimaryKeySelective(userShareGoodsRecord); // 最新商品 singleGoods.setUpdateTime(new Date()); userShareGoodsGroupService.updateByPrimaryKeySelective(singleGoods); } else { // 单个商品第一次分享 Date date = new Date(); userShareGoodsRecord.setPicture(taoBaoGoodsBrief.getPictUrl()); userShareGoodsRecord.setCreateTime(date); userShareGoodsRecord.setUpdateTime(date); userShareGoodsRecordMapper.insertSelective(userShareGoodsRecord); singleGoods = new UserShareGoodsGroup(); singleGoods.setTotalOrder(0); singleGoods.setTotalBrowse(0); singleGoods.setTodayBrowse(0); singleGoods.setTotalMoney(new BigDecimal(0)); singleGoods.setCreateTime(date); singleGoods.setUpdateTime(date); singleGoods.setCommonGoods(resultCommonGoods); singleGoods.setRecordId(userShareGoodsRecord.getId()); userShareGoodsGroupService.insertSelective(singleGoods); } } catch (CommonGoodsException e) { e.printStackTrace(); } } /** * 多个商品分享生成记录 * * @param userShareGoodsRecord * @param listGoods */ @Transactional public FileUploadResult multipleGoodsShare(UserShareGoodsRecord userShareGoodsRecord, List listGoods) throws UserShareGoodsRecordException { // 分享记录 Date date = new Date(); List listGoodsBrief = new ArrayList(); List listGroup = new ArrayList(); for (TaoBaoGoodsBrief taoBaoGoodsBrief : listGoods) { CommonGoods commonGoods = CommonGoodsFactory.create(taoBaoGoodsBrief); commonGoods.setState(taoBaoGoodsBrief.getState()); try { CommonGoods resultCommonGoods = commonGoodsService.addOrUpdateCommonGoods(commonGoods); if (resultCommonGoods != null) { TaoBaoGoodsBrief goodsBrief = TaoBaoUtil.convert(resultCommonGoods); listGoodsBrief.add(goodsBrief); } UserShareGoodsGroup shareGoodsGroup = new UserShareGoodsGroup(); shareGoodsGroup.setTotalOrder(0); shareGoodsGroup.setTotalBrowse(0); shareGoodsGroup.setTodayBrowse(0); shareGoodsGroup.setTotalMoney(new BigDecimal(0)); shareGoodsGroup.setCreateTime(date); shareGoodsGroup.setUpdateTime(date); shareGoodsGroup.setCommonGoods(resultCommonGoods); shareGoodsGroup.setRecordId(userShareGoodsRecord.getId()); listGroup.add(shareGoodsGroup); } catch (CommonGoodsException e) { e.printStackTrace(); continue; } } FileUploadResult shareImg = createShareImg(userShareGoodsRecord, listGoodsBrief); if (listGroup.size() > 0) { userShareGoodsGroupService.insertBatch(listGroup); } return shareImg; } /** * 生成分享图 * * @param uid * 用户id * @param shareId * 分享记录id * @param source * 来源 * @param listGoods * @return * @throws UserShareGoodsRecordException */ public FileUploadResult createShareImg(UserShareGoodsRecord shareRecord, List listGoods) throws UserShareGoodsRecordException { Long uid = shareRecord.getUid(); Long shareId = shareRecord.getId(); String source = shareRecord.getSource().name(); String url = String.format("http://%s/share_mushGoods.html?uid=%s&shareId=%s&source=%s", configService.getH5Host(), AESUtil.encrypt(uid + "", Constant.UIDAESKEY), shareRecord.getId() + "", source + ""); String shortLink = HttpUtil.getShortLink(url); if (!StringUtil.isNullOrEmpty(shortLink)) { url = shortLink; } InputStream erCodeInputStream = null; // 生成链接二维码 try { erCodeInputStream = QRCodeUtil.getInstance(500).encode(url); } catch (Exception e) { e.printStackTrace(); } // 获取到用户的头像 UserInfo user = userInfoMapper.selectByPrimaryKey(uid); if (user == null) { throw new UserShareGoodsRecordException(1, "用户信息不存在"); } InputStream portrait = null; if (!StringUtil.isNullOrEmpty(user.getPortrait())) { try { portrait = HttpUtil.downLoadImg(user.getPortrait()); } catch (HttpException e) { String portraitUrl = userAccountService.repairPortrait(uid); if (StringUtil.isNullOrEmpty(portraitUrl)) throw new UserShareGoodsRecordException(1, "获取头像出错"); else { // 再次获取头像 try { portrait = HttpUtil.downLoadImg(portraitUrl); } catch (HttpException e1) { throw new UserShareGoodsRecordException(1, "获取头像出错"); } } } } InputStream inputStream = ImageUtil.drawGoodsShareBigImg(erCodeInputStream, portrait, listGoods); FileUploadResult shareImg = COSManager.getInstance().uploadInputStream(inputStream, "sharegoods/share_" + uid + "_" + shareId + "_" + System.currentTimeMillis() + ".png"); return shareImg; } @Override public JSONObject getGoodsGroup(Long recordId) throws UserShareGoodsRecordException { JSONArray array = new JSONArray(); List list = userShareGoodsGroupService.listByRecordId(recordId); List listGid = new ArrayList(); for (UserShareGoodsGroup goodsGroup : list) { CommonGoods commonGoods = goodsGroup.getCommonGoods(); if (commonGoods == null) { continue; } listGid.add(commonGoods.getGoodsId()); } // API网络接口验证是否在售 List listTaoKeGoods = null; try { listTaoKeGoods = TaoKeApiUtil.getBatchGoodsInfo(listGid); } catch (TaoKeApiException e) { e.printStackTrace(); } catch (TaobaoGoodsDownException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder()) .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create(); BigDecimal shareRate = hongBaoManageService.getShareRate(java.lang.System.currentTimeMillis()); for (UserShareGoodsGroup goodsGroup : list) { CommonGoods commonGoods = goodsGroup.getCommonGoods(); if (commonGoods == null) { continue; } if (listTaoKeGoods != null && listTaoKeGoods.size() > 0) { int state = 1; // 默认停售 Long goodsId = commonGoods.getGoodsId(); for (TaoBaoGoodsBrief taoKeGoods : listTaoKeGoods) { Long auctionId = taoKeGoods.getAuctionId(); if (goodsId == auctionId || goodsId.equals(auctionId)) { state = 0; // 在售 break; } } commonGoods.setState(state); } TaoBaoGoodsBrief goodsBrief = TaoBaoUtil.convert(commonGoods); // 今日浏览记录处理 Date date = new Date(); Date browseTime = goodsGroup.getBrowseTime(); if (!DateUtil.isSameDay(browseTime, date)) { goodsGroup.setTodayBrowse(0); // 不是同一天浏览记录设置0 } JSONObject dataObject = new JSONObject(); dataObject.put("todayBrowse", goodsGroup.getTodayBrowse()); dataObject.put("totalBrowse", goodsGroup.getTotalBrowse()); dataObject.put("totalOrder", goodsGroup.getTotalOrder()); dataObject.put("totalMoney", "¥" + goodsGroup.getTotalMoney()); dataObject.put("goods", gson.toJson(TaoBaoUtil.getTaoBaoGoodsBriefExtra(goodsBrief, shareRate + "", null))); array.add(dataObject); } String title = ""; UserShareGoodsRecord userShareGoodsRecord = userShareGoodsRecordMapper.selectByPrimaryKey(recordId); if (userShareGoodsRecord != null) { title = userShareGoodsRecord.getTitle(); } JSONObject data = new JSONObject(); data.put("title", title); data.put("count", list.size()); data.put("result_list", array); return data; } @Override public JSONObject getGoodsGroupDetail(Long recordId) throws UserShareGoodsRecordException { JSONArray array = new JSONArray(); List list = userShareGoodsGroupService.listByRecordId(recordId); if (list != null && list.size() > 0) { List listGid = new ArrayList(); for (UserShareGoodsGroup goodsGroup : list) { CommonGoods commonGoods = goodsGroup.getCommonGoods(); if (commonGoods == null) { continue; } listGid.add(commonGoods.getGoodsId()); } // API网络接口验证是否在售 List listTaoKeGoods = null; try { listTaoKeGoods = TaoKeApiUtil.getBatchGoodsInfo(listGid); } catch (TaoKeApiException e) { e.printStackTrace(); } catch (TaobaoGoodsDownException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder()) .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create(); BigDecimal shareRate = hongBaoManageService.getShareRate(java.lang.System.currentTimeMillis()); for (UserShareGoodsGroup goodsGroup : list) { CommonGoods commonGoods = goodsGroup.getCommonGoods(); if (commonGoods == null) { continue; } if (listTaoKeGoods != null && listTaoKeGoods.size() > 0) { int state = 1; // 默认停售 Long goodsId = commonGoods.getGoodsId(); for (TaoBaoGoodsBrief taoKeGoods : listTaoKeGoods) { Long auctionId = taoKeGoods.getAuctionId(); if (goodsId == auctionId || goodsId.equals(auctionId)) { state = 0; // 在售 break; } } commonGoods.setState(state); } TaoBaoGoodsBrief goodsBrief = TaoBaoUtil.convert(commonGoods); if (goodsBrief.getCouponLeftCount() < 1 || StringUtil.isNullOrEmpty(goodsBrief.getCouponInfo())) { goodsBrief.setState(1); // 已抢光 } TaoBaoGoodsBriefExtra taoBaoGoodsBriefExtra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goodsBrief, shareRate + "", null); array.add(gson.toJson(taoBaoGoodsBriefExtra)); } } String title = ""; UserShareGoodsRecord userShareGoodsRecord = userShareGoodsRecordMapper.selectByPrimaryKey(recordId); if (userShareGoodsRecord != null) { title = userShareGoodsRecord.getTitle(); } JSONObject data = new JSONObject(); data.put("title", title); data.put("count", list.size()); data.put("result_list", array); return data; } @Override public void updateShareRecord(Long shareId) throws UserShareGoodsRecordException { UserShareGoodsRecord shareRecord = userShareGoodsRecordMapper.selectByPrimaryKey(shareId); if (shareRecord == null) { throw new UserShareGoodsRecordException(1, "分享记录不存在"); } shareRecord.setShareState(1);// 分享生效 updateByPrimaryKeySelective(shareRecord); // 更新商品为已分享 userGoodsStorageService.updateShareState(shareId); } @Override public long countShareRecordByUid(Long uid) { return userShareGoodsRecordMapper.countQueryByUid(uid, null); } }