admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/order/tb/TaoBaoOrderServiceImpl.java
@@ -1,273 +1,283 @@
package com.yeshi.fanli.service.impl.order.tb;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderGoodsMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderTradeMapMapper;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrderGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoOrderTradeMap;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.taobao.TaoBaoOrderUtil;
@Service
public class TaoBaoOrderServiceImpl implements TaoBaoOrderService {
   @Resource
   private TaoBaoOrderMapper taoBaoOrderMapper;
   @Resource
   private RedisManager redisManager;
   @Resource
   private TaoBaoOrderTradeMapMapper taoBaoOrderTradeMapMapper;
   @Resource(name = "transactionManager")
   private DataSourceTransactionManager transactionManager;
   @Resource
   private TaoBaoOrderGoodsMapper taoBaoOrderGoodsMapper;
   /**
    * 获取订单的哈希值
    *
    * @param list
    * @return
    */
   @Override
   public void addTaoBaoOrderList(List<TaoBaoOrder> list) {
      if (list == null || list.size() == 0)
         return;
      Map<String, List<TaoBaoOrder>> map = TaoBaoOrderUtil.classifyTaoBaoOrderByOrderId(list);
      Iterator<String> its = map.keySet().iterator();
      while (its.hasNext()) {
         String orderId = its.next();
         String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.addOrder,
               TaoBaoOrderUtil.getOrderDataHashCode(map.get(orderId)));
         // redis做频率限制
         try {
            if (Constant.IS_OUTNET) {
               if (!StringUtil.isNullOrEmpty(redisManager.getCommonString(key))) {
                  continue;
               }
            }
         } catch (Exception e) {
         }
         addTaoBaoOrder(orderId, map.get(orderId));
         try {
            // 6小时内不再处理
            if (Constant.IS_OUTNET)
               redisManager.cacheCommonString(key, "1", 60 * 60 * 6);
         } catch (Exception e) {
         }
      }
   }
   @Transactional
   private void addTaoBaoOrderTradeMap(TaoBaoOrder order) {
      if (order == null || StringUtil.isNullOrEmpty(order.getTradeId()))
         return;
      TaoBaoOrderTradeMap map = new TaoBaoOrderTradeMap();
      map.setCreateTime(new Date());
      map.setTaoBaoOrder(order);
      map.setTradeId(order.getTradeId());
      TaoBaoOrderTradeMap oldMap = taoBaoOrderTradeMapMapper.selectByTradeId(order.getTradeId());
      if (oldMap == null)
         taoBaoOrderTradeMapMapper.insertSelective(map);
   }
   // 添加淘宝订单
   private void insertTaoBaoOrder(TaoBaoOrder taoBaoOrder) {
      taoBaoOrderMapper.insertSelective(taoBaoOrder);
      addTaoBaoOrderTradeMap(taoBaoOrder);
      addTaoBaoOrderGoods(taoBaoOrder.getGoods());
   }
   @Transactional
   @Override
   public void addTaoBaoOrder(String orderId, List<TaoBaoOrder> list) {
      TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
      try {
         LogHelper.test("订单号与订单数量:" + orderId + "-" + list.size());
         // 验证orderby是否正确
         if (list != null && list.size() > 0) {
            int maxOrderBy = list.get(0).getOrderBy();
            if (list.size() > 1)
               for (TaoBaoOrder order : list) {
                  if (order.getOrderBy() > maxOrderBy)
                     maxOrderBy = order.getOrderBy();
               }
            if (list.size() != maxOrderBy) {
               LogHelper.test("捕捉到排序值错误:" + orderId);
               throw new Exception();
            }
         }
         // 验证tradeId问题
         Set<String> tradesIds = new HashSet<>();
         for (TaoBaoOrder order : list) {
            tradesIds.add(order.getTradeId());
         }
         // 有重复的交易ID不处理
         if (tradesIds.size() != list.size()) {
            // 去除重复交易ID
            tradesIds = new HashSet<>();
            for (int i = 0; i < list.size(); i++) {
               if (tradesIds.contains(list.get(i).getTradeId())) {
                  list.remove(i--);
               } else
                  tradesIds.add(list.get(i).getTradeId());
            }
            LogHelper.test("检测到交易ID重复问题:" + orderId);
//            throw new Exception();
         }
         List<TaoBaoOrder> oldOrderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
         if (oldOrderList == null || oldOrderList.size() == 0) {
            for (TaoBaoOrder taoBaoOrder : list) {
               taoBaoOrder.setLatestUpdateTime(new Date());
               insertTaoBaoOrder(taoBaoOrder);
            }
         } else {
            if (StringUtil.isNullOrEmpty(oldOrderList.get(0).getTradeId())) {
               taoBaoOrderMapper.deleteByOrderId(orderId);
               for (TaoBaoOrder taoBaoOrder : list) {
                  taoBaoOrder.setLatestUpdateTime(new Date());
                  insertTaoBaoOrder(taoBaoOrder);
               }
            } else {
               // 按tradeId更新
               for (TaoBaoOrder taoBaoOrder : list) {
                  TaoBaoOrder order = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(taoBaoOrder.getTradeId());
                  if (order == null) {
                     taoBaoOrder.setLatestUpdateTime(new Date());
                     insertTaoBaoOrder(taoBaoOrder);
                  } else {
                     taoBaoOrder.setId(order.getId());
                     if (!StringUtil.isNullOrEmpty(order.getRelationId()))
                        taoBaoOrder.setRelationId(order.getRelationId());
                     if (!StringUtil.isNullOrEmpty(order.getSpecialId()))
                        taoBaoOrder.setSpecialId(order.getSpecialId());
                     taoBaoOrder.setLatestUpdateTime(new Date());
                     taoBaoOrderMapper.updateByPrimaryKeySelective(taoBaoOrder);
                     addTaoBaoOrderTradeMap(taoBaoOrder);
                  }
               }
            }
         }
         // 提交事务
         transactionManager.commit(transactionStatus);
      } catch (Exception e) {
         e.printStackTrace();
         transactionManager.rollback(transactionStatus);
      }
   }
   @Override
   public List<TaoBaoOrder> getTaoBaoOrderByOrderId(String orderId) {
      return taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
   }
   @Override
   public double countEstimate(String date) throws Exception {
      return taoBaoOrderMapper.countEstimate(date);
   }
   @Override
   public void bindSpecialIdAndRealtionId(String tradeId, String specialId, String realtionId) {
      if (StringUtil.isNullOrEmpty(specialId) && StringUtil.isNullOrEmpty(realtionId))
         return;
      TaoBaoOrder order = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(tradeId);
      if (order != null) {
         TaoBaoOrder update = new TaoBaoOrder();
         update.setId(order.getId());
         update.setSpecialId(specialId);
         update.setRelationId(realtionId);
         update.setLatestUpdateTime(new Date());
         taoBaoOrderMapper.updateByPrimaryKeySelective(update);
      }
   }
   @Override
   public TaoBaoOrder selectByTradeId(String tradeId) {
      return taoBaoOrderMapper.selectTaoBaoOrderByTradeId(tradeId);
   }
   @Override
   public List<TaoBaoOrder> listAllOrder(int page, int pageSize) {
      return taoBaoOrderMapper.listAllOrder(null, (page - 1) * pageSize, pageSize);
   }
   @Override
   public long countAllOrder() {
      return taoBaoOrderMapper.countAllOrder(null);
   }
   @Override
   public TaoBaoOrder selectByPrimaryKey(Long id) {
      return taoBaoOrderMapper.selectByPrimaryKey(id);
   }
   @Override
   public List<TaoBaoOrder> listBySettlementTime(Long minTime, Long maxTime, int page, int pageSize) {
      return taoBaoOrderMapper.listBySettlementTime(minTime, maxTime, (page - 1) * pageSize, pageSize);
   }
   @Override
   public Long countBySettlementTime(Long minTime, Long maxTime) {
      return taoBaoOrderMapper.countBySettlementTime(minTime, maxTime);
   }
   @Override
   public List<TaoBaoOrder> listByStateAndCreateTime(String state, Date minCreateTime, Date maxCreateTime) {
      return taoBaoOrderMapper.listByStateAndCreateTime(state, minCreateTime.getTime(), maxCreateTime.getTime());
   }
   @Override
   public Long countOrderByDay(String preDay) {
      return taoBaoOrderMapper.countOrderByDay(preDay);
   }
   @Override
   public void addTaoBaoOrderGoods(TaoBaoOrderGoods goods) {
      if (goods == null || StringUtil.isNullOrEmpty(goods.getTradeId()))
         return;
      TaoBaoOrderGoods oldGoods = taoBaoOrderGoodsMapper.selectByTradeId(goods.getTradeId());
      if (oldGoods != null)
         return;
      if (goods.getCreateTime() == null)
         goods.setCreateTime(new Date());
      taoBaoOrderGoodsMapper.insertSelective(goods);
   }
}
package com.yeshi.fanli.service.impl.order.tb;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderGoodsMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderTradeMapMapper;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrderGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoOrderTradeMap;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.taobao.TaoBaoOrderUtil;
@Service
public class TaoBaoOrderServiceImpl implements TaoBaoOrderService {
    @Resource
    private TaoBaoOrderMapper taoBaoOrderMapper;
    @Resource
    private RedisManager redisManager;
    @Resource
    private TaoBaoOrderTradeMapMapper taoBaoOrderTradeMapMapper;
    @Resource(name = "transactionManager")
    private DataSourceTransactionManager transactionManager;
    @Resource
    private TaoBaoOrderGoodsMapper taoBaoOrderGoodsMapper;
    /**
     * 获取订单的哈希值
     *
     * @param list
     * @return
     */
    @Override
    public void addTaoBaoOrderList(List<TaoBaoOrder> list) {
        if (list == null || list.size() == 0)
            return;
        Map<String, List<TaoBaoOrder>> map = TaoBaoOrderUtil.classifyTaoBaoOrderByOrderId(list);
        Iterator<String> its = map.keySet().iterator();
        while (its.hasNext()) {
            String orderId = its.next();
            String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.addOrder,
                    TaoBaoOrderUtil.getOrderDataHashCode(map.get(orderId)));
            // redis做频率限制
            try {
                if (Constant.IS_OUTNET) {
                    if (!StringUtil.isNullOrEmpty(redisManager.getCommonString(key))) {
                        continue;
                    }
                }
            } catch (Exception e) {
            }
            addTaoBaoOrder(orderId, map.get(orderId));
            try {
                // 6小时内不再处理
                if (Constant.IS_OUTNET)
                    redisManager.cacheCommonString(key, "1", 60 * 60 * 6);
            } catch (Exception e) {
            }
        }
    }
    @Transactional
    private void addTaoBaoOrderTradeMap(TaoBaoOrder order) {
        if (order == null || StringUtil.isNullOrEmpty(order.getTradeId()))
            return;
        TaoBaoOrderTradeMap map = new TaoBaoOrderTradeMap();
        map.setCreateTime(new Date());
        map.setTaoBaoOrder(order);
        map.setTradeId(order.getTradeId());
        TaoBaoOrderTradeMap oldMap = taoBaoOrderTradeMapMapper.selectByTradeId(order.getTradeId());
        if (oldMap == null)
            taoBaoOrderTradeMapMapper.insertSelective(map);
    }
    // 添加淘宝订单
    private void insertTaoBaoOrder(TaoBaoOrder taoBaoOrder) {
        //如果商品ID为空,就以交易ID作为商品ID
        if(StringUtil.isNullOrEmpty(taoBaoOrder.getAuctionId())){
            taoBaoOrder.setAuctionId(taoBaoOrder.getTradeId());
        }
        taoBaoOrderMapper.insertSelective(taoBaoOrder);
        addTaoBaoOrderTradeMap(taoBaoOrder);
        addTaoBaoOrderGoods(taoBaoOrder.getGoods());
    }
    @Transactional
    @Override
    public void addTaoBaoOrder(String orderId, List<TaoBaoOrder> list) {
        TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
            LogHelper.test("订单号与订单数量:" + orderId + "-" + list.size());
            // 验证orderby是否正确
            if (list != null && list.size() > 0) {
                int maxOrderBy = list.get(0).getOrderBy();
                if (list.size() > 1)
                    for (TaoBaoOrder order : list) {
                        if (order.getOrderBy() > maxOrderBy)
                            maxOrderBy = order.getOrderBy();
                    }
                if (list.size() != maxOrderBy) {
                    LogHelper.test("捕捉到排序值错误:" + orderId);
                    throw new Exception();
                }
            }
            // 验证tradeId问题
            Set<String> tradesIds = new HashSet<>();
            for (TaoBaoOrder order : list) {
                tradesIds.add(order.getTradeId());
            }
            // 有重复的交易ID不处理
            if (tradesIds.size() != list.size()) {
                // 去除重复交易ID
                tradesIds = new HashSet<>();
                for (int i = 0; i < list.size(); i++) {
                    if (tradesIds.contains(list.get(i).getTradeId())) {
                        list.remove(i--);
                    } else
                        tradesIds.add(list.get(i).getTradeId());
                }
                LogHelper.test("检测到交易ID重复问题:" + orderId);
//            throw new Exception();
            }
            List<TaoBaoOrder> oldOrderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
            if (oldOrderList == null || oldOrderList.size() == 0) {
                for (TaoBaoOrder taoBaoOrder : list) {
                    taoBaoOrder.setLatestUpdateTime(new Date());
                    insertTaoBaoOrder(taoBaoOrder);
                }
            } else {
                if (StringUtil.isNullOrEmpty(oldOrderList.get(0).getTradeId())) {
                    taoBaoOrderMapper.deleteByOrderId(orderId);
                    for (TaoBaoOrder taoBaoOrder : list) {
                        taoBaoOrder.setLatestUpdateTime(new Date());
                        insertTaoBaoOrder(taoBaoOrder);
                    }
                } else {
                    // 按tradeId更新
                    for (TaoBaoOrder taoBaoOrder : list) {
                        TaoBaoOrder order = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(taoBaoOrder.getTradeId());
                        if (order == null) {
                            taoBaoOrder.setLatestUpdateTime(new Date());
                            insertTaoBaoOrder(taoBaoOrder);
                        } else {
                            taoBaoOrder.setId(order.getId());
                            if (!StringUtil.isNullOrEmpty(order.getRelationId()))
                                taoBaoOrder.setRelationId(order.getRelationId());
                            if (!StringUtil.isNullOrEmpty(order.getSpecialId()))
                                taoBaoOrder.setSpecialId(order.getSpecialId());
                            taoBaoOrder.setLatestUpdateTime(new Date());
                            taoBaoOrderMapper.updateByPrimaryKeySelective(taoBaoOrder);
                            addTaoBaoOrderTradeMap(taoBaoOrder);
                        }
                    }
                }
            }
            // 提交事务
            transactionManager.commit(transactionStatus);
        } catch (Exception e) {
            e.printStackTrace();
            transactionManager.rollback(transactionStatus);
        }
    }
    @Override
    public List<TaoBaoOrder> getTaoBaoOrderByOrderId(String orderId) {
        return taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
    }
    @Override
    public double countEstimate(String date) throws Exception {
        return taoBaoOrderMapper.countEstimate(date);
    }
    @Override
    public void bindSpecialIdAndRealtionId(String tradeId, String specialId, String realtionId) {
        if (StringUtil.isNullOrEmpty(specialId) && StringUtil.isNullOrEmpty(realtionId))
            return;
        TaoBaoOrder order = taoBaoOrderMapper.selectTaoBaoOrderByTradeId(tradeId);
        if (order != null) {
            TaoBaoOrder update = new TaoBaoOrder();
            update.setId(order.getId());
            update.setSpecialId(specialId);
            update.setRelationId(realtionId);
            update.setLatestUpdateTime(new Date());
            taoBaoOrderMapper.updateByPrimaryKeySelective(update);
        }
    }
    @Override
    public TaoBaoOrder selectByTradeId(String tradeId) {
        return taoBaoOrderMapper.selectTaoBaoOrderByTradeId(tradeId);
    }
    @Override
    public List<TaoBaoOrder> listAllOrder(int page, int pageSize) {
        return taoBaoOrderMapper.listAllOrder(null, (page - 1) * pageSize, pageSize);
    }
    @Override
    public long countAllOrder() {
        return taoBaoOrderMapper.countAllOrder(null);
    }
    @Override
    public TaoBaoOrder selectByPrimaryKey(Long id) {
        return taoBaoOrderMapper.selectByPrimaryKey(id);
    }
    @Override
    public List<TaoBaoOrder> listBySettlementTime(Long minTime, Long maxTime, int page, int pageSize) {
        return taoBaoOrderMapper.listBySettlementTime(minTime, maxTime, (page - 1) * pageSize, pageSize);
    }
    @Override
    public Long countBySettlementTime(Long minTime, Long maxTime) {
        return taoBaoOrderMapper.countBySettlementTime(minTime, maxTime);
    }
    @Override
    public List<TaoBaoOrder> listByStateAndCreateTime(String state, Date minCreateTime, Date maxCreateTime) {
        return taoBaoOrderMapper.listByStateAndCreateTime(state, minCreateTime.getTime(), maxCreateTime.getTime());
    }
    @Override
    public Long countOrderByDay(String preDay) {
        return taoBaoOrderMapper.countOrderByDay(preDay);
    }
    @Override
    public void addTaoBaoOrderGoods(TaoBaoOrderGoods goods) {
        if (goods == null || StringUtil.isNullOrEmpty(goods.getTradeId()))
            return;
        TaoBaoOrderGoods oldGoods = taoBaoOrderGoodsMapper.selectByTradeId(goods.getTradeId());
        if (oldGoods != null)
            return;
        if (goods.getCreateTime() == null)
            goods.setCreateTime(new Date());
        taoBaoOrderGoodsMapper.insertSelective(goods);
    }
    @Override
    public void updateSelectiveByPrimaryKey(TaoBaoOrder order) {
        taoBaoOrderMapper.updateByPrimaryKeySelective(order);
    }
}