yujian
2020-05-09 7e7db2fa55a9a3af46d4fd8ede0dee147f101d64
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserShareGoodsGroupServiceImpl.java
@@ -1,50 +1,30 @@
package com.yeshi.fanli.service.impl.user;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
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.JsonUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.dao.mybatis.share.UserShareGoodsGroupMapper;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.entity.bus.share.UserShareGoodsGroup;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.bus.share.UserShareGoodsRecord.ShareSourceTypeEnum;
import com.yeshi.fanli.exception.share.UserShareGoodsRecordException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.user.UserShareGoodsGroupService;
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.factory.CommonGoodsFactory;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
@Service
public class UserShareGoodsGroupServiceImpl implements UserShareGoodsGroupService {
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private RedisManager redisManager;
   
   @Resource
   private CommonGoodsService commonGoodsService;
@@ -84,7 +64,7 @@
   @Override
   public UserShareGoodsGroup getSingleGoods(Long cid, Long uid) {
      return userShareGoodsGroupMapper.getSingleGoods(cid, uid);
      return userShareGoodsGroupMapper.getSingleGoods(ShareSourceTypeEnum.goodsDetail,cid, uid );
   }
   @Override
@@ -93,45 +73,10 @@
   }
   @Override
   public UserShareGoodsGroup getNewestRecord(Long uid, Long auctionId) {
      return userShareGoodsGroupMapper.getNewestRecord(uid, auctionId);
   public UserShareGoodsGroup getNewestRecord(Long uid, Long auctionId, Integer goodsType) {
      return userShareGoodsGroupMapper.getNewestRecord(uid, auctionId, goodsType);
   }
   /**
    * 更新浏览记录数据
    * @param uid
    * @param auctionId
    */
   @Override
   public void updateBrowseRecord (Long uid, Long auctionId, int count) throws UserShareGoodsRecordException{
      if (uid == null) {
         throw new UserShareGoodsRecordException(1, "用户ID不能为空");
      }
      if (auctionId == null) {
         throw new UserShareGoodsRecordException(1, "商品ID不能为空");
      }
      UserShareGoodsGroup newestRecord = getNewestRecord(uid, auctionId);
      if (newestRecord != null) {
         // 注意: 修改记录数据、但不可修改更新设置
         UserShareGoodsGroup shareGoodsGroup = new UserShareGoodsGroup(newestRecord.getId());
         shareGoodsGroup.setTotalBrowse(newestRecord.getTotalBrowse() + count);
         Date browseTime = newestRecord.getBrowseTime();
         if (DateUtil.isSameDay(browseTime, new Date())) {
            shareGoodsGroup.setTodayBrowse(newestRecord.getTodayBrowse() + count);
         } else {
            shareGoodsGroup.setTodayBrowse(count);
            shareGoodsGroup.setBrowseTime(new Date());
         }
         updateByPrimaryKeySelective(shareGoodsGroup);
      }
   }
   
   /**
    * 更新订单记录数据
@@ -139,135 +84,125 @@
    * @param auctionId
    */
   @Override
   public void updateOrderRecord (Long uid, TaoBaoGoodsBrief taoBaoGoodsBrief, int count)
         throws UserShareGoodsRecordException{
   public void updateOrderRecord (HongBao hongBao, int goodsType) throws UserShareGoodsRecordException{
      
      if (hongBao == null) {
         throw new UserShareGoodsRecordException(1, "hongBao不能为空");
      }
      if (hongBao.getUserInfo() == null) {
         throw new UserShareGoodsRecordException(1, "用户信息不能为空");
      }
      Long uid = hongBao.getUserInfo().getId();
      if (uid == null) {
         throw new UserShareGoodsRecordException(1, "用户ID不能为空");
      }
      
      if (taoBaoGoodsBrief == null) {
         throw new UserShareGoodsRecordException(1, "商品不能为空");
      if (hongBao.getAuctionId() == null) {
         throw new UserShareGoodsRecordException(1, "商品ID不能为空");
      }
      
      UserShareGoodsGroup newestRecord = getNewestRecord(uid, taoBaoGoodsBrief.getAuctionId());
      UserShareGoodsGroup newestRecord = getNewestRecord(uid, hongBao.getAuctionId(), goodsType);
      
      if (newestRecord != null) {
         // 注意: 修改记录数据、但不可修改更新设置
         // 更新订单数量
         UserShareGoodsGroup shareGoodsGroup = new UserShareGoodsGroup(newestRecord.getId());
         shareGoodsGroup.setTotalOrder(newestRecord.getTotalOrder() + count);
         Integer totalOrder = newestRecord.getTotalOrder();
         
         // 单个商品预计金额
         String rateStr = hongBaoManageService.get("hongbao_goods_proportion");
         BigDecimal money = TaoBaoUtil.getGoodsHongBaoMoney(taoBaoGoodsBrief, new BigDecimal(rateStr));
         if (totalOrder == null) {
            totalOrder = 0;
         }
         shareGoodsGroup.setTotalOrder(totalOrder + 1);
         
         // 更新预计收益 
         BigDecimal resultMoney = MoneyBigDecimalUtil.mul(new BigDecimal(shareGoodsGroup.getTotalOrder()), money);
         BigDecimal totalMoney = newestRecord.getTotalMoney();
         if (totalMoney == null) {
            totalMoney = new BigDecimal(0);
         }
         BigDecimal resultMoney = MoneyBigDecimalUtil.add(totalMoney, hongBao.getMoney());
         shareGoodsGroup.setTotalMoney(resultMoney);
         
         updateByPrimaryKeySelective(shareGoodsGroup);
      }
   }
   
   /**
    * 更新订单记录数据
    * @param uid
    * @param auctionId
    */
   @Override
   public JSONObject getGoodsGroup(Long recordId) throws UserShareGoodsRecordException {
   public void updateBrowseRecord (Long uid, Long auctionId, int count)
         throws UserShareGoodsRecordException{
      
      List<CommonGoods> listUpadteCommonGoods = new ArrayList<CommonGoods>();
      JSONArray array = new JSONArray();
      List<UserShareGoodsGroup> list = listByRecordId(recordId);
      if (list != null && list.size() > 0) {
         Date nowDate = new Date();
         long nh = 1000 * 60 * 60;
         long nd = 1000 * 24 * 60 * 60;
         Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
               .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
         Map<String, String> map = hongBaoManageService.convertMap();
         String proportion = map.get("hongbao_goods_proportion");
         String fcRate = map.get("hongbao_fc_ratio");
         for (UserShareGoodsGroup userShareGoodsGroup : list) {
            CommonGoods commonGoods = userShareGoodsGroup.getCommonGoods();
            if (commonGoods == null) {
               continue;
            }
            TaoBaoGoodsBrief goodsBrief = null;
            JSONObject dataObject = new JSONObject();
            // 更新一个小时之内的商品不再更新
            Integer goodsState = commonGoods.getState();
            // 状态未下架时进行更新
            if (goodsState != null && (goodsState != 1 || !goodsState.equals(1))) {
               Date updateTime = commonGoods.getUpdateTime();
               if (updateTime != null) {
                  long diff = nowDate.getTime() - updateTime.getTime();
                  // 计算差多少小时
                  long hour = diff % nd / nh;
                  if (hour > 1) {
                     try {
                        if (commonGoods.getGoodsType() == CommonGoods.GOODS_TYPE_TB) {
                           goodsBrief = redisManager.getTaoBaoGoodsBrief(commonGoods.getGoodsId());
                           goodsBrief.setState(0);
                           goodsState = 0;
                        }
                     } catch (TaobaoGoodsDownException e) {
                        // 已下架
                        goodsState = 1;
                        commonGoods.setState(1);
                        e.printStackTrace();
                     }
                  }
               }
            }
            if (goodsBrief == null) {
               goodsBrief = TaoBaoUtil.convert(commonGoods);
            } else {
               CommonGoods upadeteCommonGoods = CommonGoodsFactory.create(goodsBrief);
               upadeteCommonGoods.setState(goodsState);
               listUpadteCommonGoods.add(upadeteCommonGoods);
            }
            // 改变图片尺寸
            String pictUrl = commonGoods.getPicture();
            if (!StringUtil.isNullOrEmpty(pictUrl) && !pictUrl.contains("320x320")) {
               commonGoods.setPicture(TbImgUtil.getTBSize320Img(pictUrl));
            }
            String json = gson
                  .toJson(TaoBaoUtil.getTaoBaoGoodsBriefExtra(goodsBrief, proportion, fcRate, null));
            dataObject.put("groupId", userShareGoodsGroup.getId());
            dataObject.put("goods", json);
            array.add(dataObject);
      if (uid == null) {
         throw new UserShareGoodsRecordException(1, "用户ID不能为空");
      }
      if (auctionId == null) {
         throw new UserShareGoodsRecordException(1, "商品Id不能为空");
      }
      UserShareGoodsGroup group = getNewestRecord(uid, auctionId, Constant.SOURCE_TYPE_TAOBAO);
      if (group != null) {
         UserShareGoodsGroup shareGoodsGroup = new UserShareGoodsGroup(group.getId());
         // 累计浏览
         Integer totalBrowse = group.getTotalBrowse();
         if (totalBrowse == null) {
            totalBrowse = 0;
         }
         shareGoodsGroup.setTotalBrowse(totalBrowse + count);
         // 今日浏览
         Date date = new Date();
         Date browseTime = group.getBrowseTime();
         if (DateUtil.isSameDay(browseTime, date)) {
            shareGoodsGroup.setTodayBrowse(group.getTodayBrowse() + count);
         } else {
            shareGoodsGroup.setTodayBrowse(count);
         }
         shareGoodsGroup.setBrowseTime(date);
         userShareGoodsGroupMapper.updateByPrimaryKeySelective(shareGoodsGroup);
      }
      JSONObject data = new JSONObject();
      data.put("count", list.size());
      data.put("result_list", array);
      if (listUpadteCommonGoods.size() > 0) {
         executor.execute(new Runnable() {
            @Override
            public void run() {
               try {
                  // 更新简版信息
                  commonGoodsService.updateBatchCommonGoods(listUpadteCommonGoods);
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         });
      }
      return data;
   }
   @Override
   public void updateBrowseNum(Long uid, Long id, int goodsType) throws UserShareGoodsRecordException{
      if (uid == null) {
         throw new UserShareGoodsRecordException(1, "用户ID不能为空");
      }
      if (id == null) {
         throw new UserShareGoodsRecordException(1, "商品Id不能为空");
      }
      UserShareGoodsGroup group = getNewestRecord(uid, id, goodsType);
      if (group != null) {
         UserShareGoodsGroup shareGoodsGroup = new UserShareGoodsGroup(group.getId());
         // 累计浏览
         Integer totalBrowse = group.getTotalBrowse();
         if (totalBrowse == null) {
            totalBrowse = 0;
         }
         shareGoodsGroup.setTotalBrowse(totalBrowse + 1);
         // 今日浏览
         Date date = new Date();
         Date browseTime = group.getBrowseTime();
         if (DateUtil.isSameDay(browseTime, date)) {
            shareGoodsGroup.setTodayBrowse(group.getTodayBrowse() + 1);
         } else {
            shareGoodsGroup.setTodayBrowse(1);
         }
         shareGoodsGroup.setBrowseTime(date);
         userShareGoodsGroupMapper.updateByPrimaryKeySelective(shareGoodsGroup);
      }
   }
}