admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java
@@ -1,810 +1,808 @@
package com.yeshi.fanli.dao.order;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import org.yeshi.utils.DateUtil;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.GroupCommand;
import com.yeshi.fanli.dao.MongodbBaseDao;
import com.yeshi.fanli.entity.order.OrderMoneyDailyCount;
import com.yeshi.fanli.entity.order.OrderMoneyDailyCount.SourceTypeEnum;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.vo.order.OrderRankingVO;
@Repository
public class OrderMoneyDailyCountDao extends MongodbBaseDao<OrderMoneyDailyCount> {
   private static String collectionName = "order_money_daily_count";
   /**
    * 选择更新
    *
    * @param info
    */
   public void updateSelective(OrderMoneyDailyCount info) {
      Query query = new Query();
      query.addCriteria(Criteria.where("id").is(info.getId()));
      Update update = new Update();
      if (info.getIncome() != null)
         update.set("income", info.getIncome());
      if (info.getIncomeTeam() != null)
         update.set("incomeTeam", info.getIncomeTeam());
      if (info.getOrderNum() != null)
         update.set("orderNum", info.getOrderNum());
      if (info.getOrderNumTeam() != null)
         update.set("orderNumTeam", info.getOrderNumTeam());
      if (info.getTeamReward() != null)
         update.set("teamReward", info.getTeamReward());
      if (info.getTeamRewardNum() != null)
         update.set("teamRewardNum", info.getTeamRewardNum());
      if (info.getTeamSubsidy() != null)
         update.set("teamSubsidy", info.getTeamSubsidy());
      if (info.getTeamSubsidyNum() != null)
         update.set("teamSubsidyNum", info.getTeamSubsidyNum());
      if (info.getDirectOrderNum() != null)
         update.set("directOrderNum", info.getDirectOrderNum());
      if (info.getInDirectOrderNum() != null)
         update.set("inDirectOrderNum", info.getInDirectOrderNum());
      if (info.getBeyondOrderNum() != null)
         update.set("beyondOrderNum", info.getBeyondOrderNum());
      update.set("updateTime", new Date());
      update(query, update);
   }
   // 查询
   public List<OrderMoneyDailyCount> query(Long uid, Date minDay, Date maxDay) {
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDay != null)
         list.add(Criteria.where("countDay").gte(minDay));
      if (maxDay != null)
         list.add(Criteria.where("countDay").lte(maxDay));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      query.with(new Sort(Sort.Direction.ASC, "countDay"));
      return findList(query);
   }
   /**
    * 统计我的金额订单数量-- 来源分组统计
    *
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumGroupBySourceType(Long uid, Date minDate, Date maxDate) {
      List<OrderMoneyDailyCount> listDailyCount = new ArrayList<>();
      String reduce = "function(doc, aggr){"
            + " aggr.totalIncome += doc.income;"
            + " aggr.totalNum += doc.orderNum;" + "}";
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      BasicDBObject agg = new BasicDBObject("sourceType", "");
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      BasicDBObject dbObject = new BasicDBObject(map);
      // BasicDBObject basicDBObject2 = new BasicDBObject("total", 0);
      DBObject result = mongoTemplate.getCollection(collectionName).group(agg, query.getQueryObject(), dbObject,
            reduce);
      Map<String, BasicDBObject> mapResult = result.toMap();
      if (mapResult.size() > 0) {
         SourceTypeEnum[] arrayEnun = SourceTypeEnum.values();
         for (int i = 0; i < mapResult.size(); i++) {
            BasicDBObject object = mapResult.get(i + "");
            if (object == null || object.get("sourceType") == null) {
               continue;
            }
            SourceTypeEnum sourceTypeEnum = null;
            for (int m = 0; m < arrayEnun.length; m++) {
               if (arrayEnun[m].name().equals(object.get("sourceType").toString())) {
                  sourceTypeEnum = arrayEnun[m];
                  break;
               }
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setSourceType(sourceTypeEnum);
            dailyCount.setIncome(new BigDecimal(object.get("totalIncome").toString()).intValue());
            dailyCount.setOrderNum(new BigDecimal(object.get("totalNum").toString()).intValue());
            listDailyCount.add(dailyCount);
         }
      }
      return listDailyCount;
   }
   /**
    * 统计团队金额订单数量-- 来源分组统计
    *
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamGroupBySourceType(Long uid, Date minDate, Date maxDate) {
      List<OrderMoneyDailyCount> listDailyCount = new ArrayList<>();
      // 统计方法
      String reduce = "function(doc, aggr){"
            + " aggr.totalIncome += doc.incomeTeam;"
            + " aggr.totalNum += doc.orderNumTeam;" + "}";
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      BasicDBObject agg = new BasicDBObject("sourceType", "");
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      BasicDBObject dbObject = new BasicDBObject(map);
      // BasicDBObject basicDBObject2 = new BasicDBObject("total", 0);
      DBObject result = mongoTemplate.getCollection(collectionName).group(agg, query.getQueryObject(), dbObject,
            reduce);
      Map<String, BasicDBObject> mapResult = result.toMap();
      if (mapResult.size() > 0) {
         SourceTypeEnum[] arrayEnun = SourceTypeEnum.values();
         for (int i = 0; i < mapResult.size(); i++) {
            BasicDBObject object = mapResult.get(i + "");
            if (object == null || object.get("sourceType") == null) {
               continue;
            }
            SourceTypeEnum sourceTypeEnum = null;
            for (int m = 0; m < arrayEnun.length; m++) {
               if (arrayEnun[m].name().equals(object.get("sourceType").toString())) {
                  sourceTypeEnum = arrayEnun[m];
                  break;
               }
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setSourceType(sourceTypeEnum);
            dailyCount.setIncome(new BigDecimal(object.get("totalIncome").toString()).intValue());
            dailyCount.setOrderNum(new BigDecimal(object.get("totalNum").toString()).intValue());
            listDailyCount.add(dailyCount);
         }
      }
      return listDailyCount;
   }
   private String getReduce() {
      StringBuilder builder = new StringBuilder();
      builder.append("function(doc, aggr){ ");
      builder.append(" aggr.totalIncome += doc.income;");
      builder.append(" aggr.totalNum += doc.orderNum;");
      builder.append(" aggr.totalIncomeTeam += doc.incomeTeam;");
      builder.append(" aggr.totalNumTeam += doc.orderNumTeam;");
      builder.append(" }");
      return builder.toString();
   }
//   private String getReduce2() {
//   StringBuilder builder = new StringBuilder();
//   builder.append("function(doc, aggr){ ");
//   builder.append(" aggr.totalIncome += parseFloat((Math.round((doc.income)*100)/100).toFixed(2));");
//   builder.append(" aggr.totalNum += doc.orderNum;");
//   builder.append(" aggr.totalIncomeTeam += parseFloat((Math.round((doc.incomeTeam)*100)/100).toFixed(2));");
//   builder.append(" aggr.totalNumTeam += doc.orderNumTeam;");
//   builder.append(" }");
//   return builder.toString();
//}
   /**
    * 统计每天订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumGroupByCountDay(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      map.put("totalIncomeTeam", 0);
      map.put("totalNumTeam", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("countDay", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("countDay");
            if (object == null) {
               continue;
            }
            try {
               String date = object.toString();
               Date dtime = sdf.parse(date);
               OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
               dailyCount.setCountDay(dtime);
               dailyCount.setIncome(new BigDecimal(dbObject.get("totalIncome").toString()).intValue());
               dailyCount.setOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
               dailyCount.setIncomeTeam(new BigDecimal(dbObject.get("totalIncomeTeam").toString()).intValue());
               dailyCount.setOrderNumTeam(new BigDecimal(dbObject.get("totalNumTeam").toString()).intValue());
               results.add(dailyCount);
            } catch (ParseException e) {
               e.printStackTrace();
               continue;
            }
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumGroupByYearMonth(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      map.put("totalIncomeTeam", 0);
      map.put("totalNumTeam", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("yearMonth", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("yearMonth");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setYearMonth(object.toString());
            dailyCount.setIncome(new BigDecimal(dbObject.get("totalIncome").toString()).intValue());
            dailyCount.setOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
            dailyCount.setIncomeTeam(new BigDecimal(dbObject.get("totalIncomeTeam").toString()).intValue());
            dailyCount.setOrderNumTeam(new BigDecimal(dbObject.get("totalNumTeam").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   private String getTeamReduce() {
      StringBuilder builder = new StringBuilder();
      builder.append("function(doc, aggr){ ");
      builder.append(" aggr.totalReward += doc.teamReward;");
      builder.append(" aggr.totalRewardNum += doc.teamRewardNum;");
      builder.append(" aggr.totalSubsidy += doc.teamSubsidy;");
      builder.append(" aggr.totalSubsidyNum += doc.teamSubsidyNum;");
      builder.append(" }");
      return builder.toString();
   }
   /**
    * 统计每天订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamGroupByCountDay(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalReward", 0);
      map.put("totalRewardNum", 0);
      map.put("totalSubsidy", 0);
      map.put("totalSubsidyNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("countDay", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("countDay");
            if (object == null) {
               continue;
            }
            try {
               String date = object.toString();
               Date dtime = sdf.parse(date);
               OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
               dailyCount.setCountDay(dtime);
               dailyCount.setTeamReward(new BigDecimal(dbObject.get("totalReward").toString()).intValue());
               dailyCount.setTeamRewardNum(new BigDecimal(dbObject.get("totalRewardNum").toString()).intValue());
               dailyCount.setTeamSubsidy(new BigDecimal(dbObject.get("totalSubsidy").toString()).intValue());
               dailyCount.setTeamSubsidyNum(new BigDecimal(dbObject.get("totalSubsidyNum").toString()).intValue());
               results.add(dailyCount);
            } catch (ParseException e) {
               e.printStackTrace();
               continue;
            }
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamGroupByYearMonth(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalReward", 0);
      map.put("totalRewardNum", 0);
      map.put("totalSubsidy", 0);
      map.put("totalSubsidyNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("yearMonth", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("yearMonth");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setYearMonth(object.toString());
            dailyCount.setTeamReward(new BigDecimal(dbObject.get("totalReward").toString()).intValue());
            dailyCount.setTeamRewardNum(new BigDecimal(dbObject.get("totalRewardNum").toString()).intValue());
            dailyCount.setTeamSubsidy(new BigDecimal(dbObject.get("totalSubsidy").toString()).intValue());
            dailyCount.setTeamSubsidyNum(new BigDecimal(dbObject.get("totalSubsidyNum").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   private String getTeamOrderNumReduce() {
      StringBuilder builder = new StringBuilder();
      builder.append("function(doc, aggr){ ");
      builder.append(" aggr.directOrderNum += doc.directOrderNum;");
      builder.append(" aggr.inDirectOrderNum += doc.inDirectOrderNum;");
      builder.append(" aggr.beyondOrderNum += doc.beyondOrderNum;");
      builder.append(" }");
      return builder.toString();
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamOrderNumGroupByCountDay(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("directOrderNum", 0);
      map.put("inDirectOrderNum", 0);
      map.put("beyondOrderNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("countDay", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamOrderNumReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("countDay");
            if (object == null) {
               continue;
            }
            try {
               String date = object.toString();
               Date dtime = sdf.parse(date);
               OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
               dailyCount.setCountDay(dtime);
               dailyCount.setDirectOrderNum(new BigDecimal(dbObject.get("directOrderNum").toString()).intValue());
               dailyCount.setInDirectOrderNum(new BigDecimal(dbObject.get("inDirectOrderNum").toString()).intValue());
               dailyCount.setBeyondOrderNum(new BigDecimal(dbObject.get("beyondOrderNum").toString()).intValue());
               results.add(dailyCount);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamOrderNumGroupByYearMonth(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("directOrderNum", 0);
      map.put("inDirectOrderNum", 0);
      map.put("beyondOrderNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("yearMonth", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamOrderNumReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("yearMonth");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setYearMonth(object.toString());
            dailyCount.setDirectOrderNum(new BigDecimal(dbObject.get("directOrderNum").toString()).intValue());
            dailyCount.setInDirectOrderNum(new BigDecimal(dbObject.get("inDirectOrderNum").toString()).intValue());
            dailyCount.setBeyondOrderNum(new BigDecimal(dbObject.get("beyondOrderNum").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamOrderNumGroupByUid(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lte(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("directOrderNum", 0);
      map.put("inDirectOrderNum", 0);
      map.put("beyondOrderNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("uid", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamOrderNumReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("uid");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setDirectOrderNum(new BigDecimal(dbObject.get("directOrderNum").toString()).intValue());
            dailyCount.setInDirectOrderNum(new BigDecimal(dbObject.get("inDirectOrderNum").toString()).intValue());
            dailyCount.setBeyondOrderNum(new BigDecimal(dbObject.get("beyondOrderNum").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   /**
    * 根据订单排行榜进行uid分组订单数量排序
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderRankingVO> getRankingByOrderNum(Long uid, Date minDate, Date maxDate) {
       LookupOperation lookupToLots = LookupOperation.newLookup().
                from("order_money_daily_count").//关联表名,多方
                localField("workerUid").// 主表关联字段
                foreignField("uid").// 次表字段关联字段
                as("orders"); // 次表的别名
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("bossUid").is(uid));
      list.add(Criteria.where("orders.orderNum").gt(0));
      if (minDate != null) {
         minDate = DateUtil.reduceDay(minDate, 1);
         list.add(Criteria.where("orders.countDay").gt(minDate));
      }
      if (maxDate != null) {
         maxDate = DateUtil.reduceDay(maxDate, 1);
         list.add(Criteria.where("orders.countDay").lte(maxDate));
      }
      // 转换数组
      Criteria[] cas = new Criteria[list.size()];
      for (int i = 0; i < list.size(); i++)
         cas[i] = list.get(i);
      // 查询参数
      Criteria criteria = new Criteria().andOperator(cas);
        List<AggregationOperation> aggs = new ArrayList<>();
        // 左连接
        aggs.add(lookupToLots);
        // 拆分子数组
        aggs.add(Aggregation.unwind("orders"));
        // 条件匹配
        aggs.add(Aggregation.match(criteria));
        // 需要返回的字段
        aggs.add(Aggregation.project().and("workerUid").as("workerUid").and("level").as("level")
              .and("orders.orderNum").as("number"));
        // 分组求和并返回
        aggs.add(Aggregation.group("workerUid").first("workerUid").as("workerUid").first("level").as("level")
              .sum("number").as("number"));
        // 排序
        aggs.add(Aggregation.sort(new Sort(Sort.Direction.DESC, "number")));
        aggs.add(Aggregation.limit(10));
        // 组织条件
        Aggregation agg = Aggregation.newAggregation(aggs);
        // 执行查询
        AggregationResults<BasicDBObject> results = mongoTemplate.aggregate(agg, "threeSaleDetail", BasicDBObject.class);
        // 返回结果处理
        List<BasicDBObject> livevideo  = results.getMappedResults();
        List<OrderRankingVO> resultList = new ArrayList<>();
        for (BasicDBObject obj : livevideo) {
         Object object = obj.get("workerUid");
         if (object == null) {
            continue;
         }
         OrderRankingVO vo = new OrderRankingVO();
         vo.setUid(new BigDecimal(obj.get("workerUid").toString()).longValue());
         vo.setGrade(new BigDecimal(obj.get("level").toString()).intValue());
         vo.setNumber(new BigDecimal(obj.get("number").toString()).intValue());
         resultList.add(vo);
      }
        return resultList;
   }
}
package com.yeshi.fanli.dao.order;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import org.yeshi.utils.DateUtil;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.GroupCommand;
import com.yeshi.common.MongodbBaseDao;
import com.yeshi.fanli.entity.order.OrderMoneyDailyCount;
import com.yeshi.fanli.entity.order.SourceTypeEnum;
import com.yeshi.fanli.vo.order.OrderRankingVO;
@Repository
public class OrderMoneyDailyCountDao extends MongodbBaseDao<OrderMoneyDailyCount> {
   private static String collectionName = "order_money_daily_count";
   /**
    * 选择更新
    *
    * @param info
    */
   public void updateSelective(OrderMoneyDailyCount info) {
      Query query = new Query();
      query.addCriteria(Criteria.where("id").is(info.getId()));
      Update update = new Update();
      if (info.getIncome() != null)
         update.set("income", info.getIncome());
      if (info.getIncomeTeam() != null)
         update.set("incomeTeam", info.getIncomeTeam());
      if (info.getOrderNum() != null)
         update.set("orderNum", info.getOrderNum());
      if (info.getOrderNumTeam() != null)
         update.set("orderNumTeam", info.getOrderNumTeam());
      if (info.getTeamReward() != null)
         update.set("teamReward", info.getTeamReward());
      if (info.getTeamRewardNum() != null)
         update.set("teamRewardNum", info.getTeamRewardNum());
      if (info.getTeamSubsidy() != null)
         update.set("teamSubsidy", info.getTeamSubsidy());
      if (info.getTeamSubsidyNum() != null)
         update.set("teamSubsidyNum", info.getTeamSubsidyNum());
      if (info.getTeamDividentsOrderNum() != null)
         update.set("teamDividentsOrderNum", info.getTeamDividentsOrderNum());
      if (info.getDirectOrderNum() != null)
         update.set("directOrderNum", info.getDirectOrderNum());
      if (info.getInDirectOrderNum() != null)
         update.set("inDirectOrderNum", info.getInDirectOrderNum());
      if (info.getBeyondOrderNum() != null)
         update.set("beyondOrderNum", info.getBeyondOrderNum());
      update.set("updateTime", new Date());
      update(query, update);
   }
   // 查询
   public List<OrderMoneyDailyCount> query(Long uid, Date minDay, Date maxDay) {
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDay != null)
         list.add(Criteria.where("countDay").gte(minDay));
      if (maxDay != null)
         list.add(Criteria.where("countDay").lt(maxDay));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      query.with(new Sort(Sort.Direction.ASC, "countDay"));
      return findList(query);
   }
   /**
    * 统计我的金额订单数量-- 来源分组统计
    *
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumGroupBySourceType(Long uid, Date minDate, Date maxDate) {
      List<OrderMoneyDailyCount> listDailyCount = new ArrayList<>();
      String reduce = "function(doc, aggr){" + " aggr.totalIncome += doc.income;" + " aggr.totalNum += doc.orderNum;"
            + "}";
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      BasicDBObject agg = new BasicDBObject("sourceType", "");
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      BasicDBObject dbObject = new BasicDBObject(map);
      // BasicDBObject basicDBObject2 = new BasicDBObject("total", 0);
      DBObject result = mongoTemplate.getCollection(collectionName).group(agg, query.getQueryObject(), dbObject,
            reduce);
      Map<String, BasicDBObject> mapResult = result.toMap();
      if (mapResult.size() > 0) {
         SourceTypeEnum[] arrayEnun = SourceTypeEnum.values();
         for (int i = 0; i < mapResult.size(); i++) {
            BasicDBObject object = mapResult.get(i + "");
            if (object == null || object.get("sourceType") == null) {
               continue;
            }
            SourceTypeEnum sourceTypeEnum = null;
            for (int m = 0; m < arrayEnun.length; m++) {
               if (arrayEnun[m].name().equals(object.get("sourceType").toString())) {
                  sourceTypeEnum = arrayEnun[m];
                  break;
               }
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setSourceType(sourceTypeEnum);
            dailyCount.setIncome(new BigDecimal(object.get("totalIncome").toString()).intValue());
            dailyCount.setOrderNum(new BigDecimal(object.get("totalNum").toString()).intValue());
            listDailyCount.add(dailyCount);
         }
      }
      return listDailyCount;
   }
   /**
    * 统计团队金额订单数量-- 来源分组统计
    *
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamGroupBySourceType(Long uid, Date minDate, Date maxDate) {
      List<OrderMoneyDailyCount> listDailyCount = new ArrayList<>();
      // 统计方法
      String reduce = "function(doc, aggr){" + " aggr.totalIncome += doc.incomeTeam;"
            + " aggr.totalNum += doc.orderNumTeam;" + "}";
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      BasicDBObject agg = new BasicDBObject("sourceType", "");
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      BasicDBObject dbObject = new BasicDBObject(map);
      // BasicDBObject basicDBObject2 = new BasicDBObject("total", 0);
      DBObject result = mongoTemplate.getCollection(collectionName).group(agg, query.getQueryObject(), dbObject,
            reduce);
      Map<String, BasicDBObject> mapResult = result.toMap();
      if (mapResult.size() > 0) {
         SourceTypeEnum[] arrayEnun = SourceTypeEnum.values();
         for (int i = 0; i < mapResult.size(); i++) {
            BasicDBObject object = mapResult.get(i + "");
            if (object == null || object.get("sourceType") == null) {
               continue;
            }
            SourceTypeEnum sourceTypeEnum = null;
            for (int m = 0; m < arrayEnun.length; m++) {
               if (arrayEnun[m].name().equals(object.get("sourceType").toString())) {
                  sourceTypeEnum = arrayEnun[m];
                  break;
               }
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setSourceType(sourceTypeEnum);
            dailyCount.setIncome(new BigDecimal(object.get("totalIncome").toString()).intValue());
            dailyCount.setOrderNum(new BigDecimal(object.get("totalNum").toString()).intValue());
            listDailyCount.add(dailyCount);
         }
      }
      return listDailyCount;
   }
   private String getReduce() {
      StringBuilder builder = new StringBuilder();
      builder.append("function(doc, aggr){ ");
      builder.append(" aggr.totalIncome += doc.income;");
      builder.append(" aggr.totalNum += doc.orderNum;");
      builder.append(" aggr.totalIncomeTeam += doc.incomeTeam;");
      builder.append(" aggr.totalNumTeam += doc.orderNumTeam;");
      builder.append(" }");
      return builder.toString();
   }
   // private String getReduce2() {
   // StringBuilder builder = new StringBuilder();
   // builder.append("function(doc, aggr){ ");
   // builder.append(" aggr.totalIncome +=
   // parseFloat((Math.round((doc.income)*100)/100).toFixed(2));");
   // builder.append(" aggr.totalNum += doc.orderNum;");
   // builder.append(" aggr.totalIncomeTeam +=
   // parseFloat((Math.round((doc.incomeTeam)*100)/100).toFixed(2));");
   // builder.append(" aggr.totalNumTeam += doc.orderNumTeam;");
   // builder.append(" }");
   // return builder.toString();
   // }
   /**
    * 统计每天订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumGroupByCountDay(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      map.put("totalIncomeTeam", 0);
      map.put("totalNumTeam", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("countDay", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("countDay");
            if (object == null) {
               continue;
            }
            try {
               String date = object.toString();
               Date dtime = sdf.parse(date);
               OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
               dailyCount.setCountDay(dtime);
               dailyCount.setIncome(new BigDecimal(dbObject.get("totalIncome").toString()).intValue());
               dailyCount.setOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
               dailyCount.setIncomeTeam(new BigDecimal(dbObject.get("totalIncomeTeam").toString()).intValue());
               dailyCount.setOrderNumTeam(new BigDecimal(dbObject.get("totalNumTeam").toString()).intValue());
               results.add(dailyCount);
            } catch (ParseException e) {
               e.printStackTrace();
               continue;
            }
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumGroupByYearMonth(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalIncome", 0);
      map.put("totalNum", 0);
      map.put("totalIncomeTeam", 0);
      map.put("totalNumTeam", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("yearMonth", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("yearMonth");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setYearMonth(object.toString());
            dailyCount.setIncome(new BigDecimal(dbObject.get("totalIncome").toString()).intValue());
            dailyCount.setOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
            dailyCount.setIncomeTeam(new BigDecimal(dbObject.get("totalIncomeTeam").toString()).intValue());
            dailyCount.setOrderNumTeam(new BigDecimal(dbObject.get("totalNumTeam").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   private String getTeamReduce() {
      StringBuilder builder = new StringBuilder();
      builder.append("function(doc, aggr){ ");
      builder.append(" aggr.totalReward += doc.teamReward;");
      builder.append(" aggr.totalRewardNum += doc.teamRewardNum;");
      builder.append(" aggr.totalSubsidy += doc.teamSubsidy;");
      builder.append(" aggr.totalSubsidyNum += doc.teamSubsidyNum;");
      builder.append(" aggr.totalNum += doc.teamDividentsOrderNum;");
      builder.append(" }");
      return builder.toString();
   }
   /**
    * 统计每天订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamGroupByCountDay(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalReward", 0);
      map.put("totalRewardNum", 0);
      map.put("totalSubsidy", 0);
      map.put("totalSubsidyNum", 0);
      map.put("totalNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("countDay", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("countDay");
            if (object == null) {
               continue;
            }
            try {
               String date = object.toString();
               Date dtime = sdf.parse(date);
               OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
               dailyCount.setCountDay(dtime);
               dailyCount.setTeamReward(new BigDecimal(dbObject.get("totalReward").toString()).intValue());
               dailyCount.setTeamRewardNum(new BigDecimal(dbObject.get("totalRewardNum").toString()).intValue());
               dailyCount.setTeamSubsidy(new BigDecimal(dbObject.get("totalSubsidy").toString()).intValue());
               dailyCount.setTeamSubsidyNum(new BigDecimal(dbObject.get("totalSubsidyNum").toString()).intValue());
               dailyCount.setTeamDividentsOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
               results.add(dailyCount);
            } catch (ParseException e) {
               e.printStackTrace();
               continue;
            }
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamGroupByYearMonth(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("totalReward", 0);
      map.put("totalRewardNum", 0);
      map.put("totalSubsidy", 0);
      map.put("totalSubsidyNum", 0);
      map.put("totalNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("yearMonth", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamReduce(), null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("yearMonth");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setYearMonth(object.toString());
            dailyCount.setTeamReward(new BigDecimal(dbObject.get("totalReward").toString()).intValue());
            dailyCount.setTeamRewardNum(new BigDecimal(dbObject.get("totalRewardNum").toString()).intValue());
            dailyCount.setTeamSubsidy(new BigDecimal(dbObject.get("totalSubsidy").toString()).intValue());
            dailyCount.setTeamSubsidyNum(new BigDecimal(dbObject.get("totalSubsidyNum").toString()).intValue());
            dailyCount.setTeamDividentsOrderNum(new BigDecimal( dbObject.get("totalNum") .toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   private String getTeamOrderNumReduce() {
      StringBuilder builder = new StringBuilder();
      builder.append("function(doc, aggr){ ");
      builder.append(" aggr.directOrderNum += doc.directOrderNum;");
      builder.append(" aggr.inDirectOrderNum += doc.inDirectOrderNum;");
      builder.append(" aggr.beyondOrderNum += doc.beyondOrderNum;");
      builder.append(" }");
      return builder.toString();
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamOrderNumGroupByCountDay(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("directOrderNum", 0);
      map.put("inDirectOrderNum", 0);
      map.put("beyondOrderNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("countDay", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamOrderNumReduce(),
            null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("countDay");
            if (object == null) {
               continue;
            }
            try {
               String date = object.toString();
               Date dtime = sdf.parse(date);
               OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
               dailyCount.setCountDay(dtime);
               dailyCount.setDirectOrderNum(new BigDecimal(dbObject.get("directOrderNum").toString()).intValue());
               dailyCount.setInDirectOrderNum(
                     new BigDecimal(dbObject.get("inDirectOrderNum").toString()).intValue());
               dailyCount.setBeyondOrderNum(new BigDecimal(dbObject.get("beyondOrderNum").toString()).intValue());
               results.add(dailyCount);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamOrderNumGroupByYearMonth(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("directOrderNum", 0);
      map.put("inDirectOrderNum", 0);
      map.put("beyondOrderNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("yearMonth", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamOrderNumReduce(),
            null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("yearMonth");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setYearMonth(object.toString());
            dailyCount.setDirectOrderNum(new BigDecimal(dbObject.get("directOrderNum").toString()).intValue());
            dailyCount.setInDirectOrderNum(new BigDecimal(dbObject.get("inDirectOrderNum").toString()).intValue());
            dailyCount.setBeyondOrderNum(new BigDecimal(dbObject.get("beyondOrderNum").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   /**
    *    统计每月订单收入、数量
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderMoneyDailyCount> sumTeamOrderNumGroupByUid(Long uid, Date minDate, Date maxDate) {
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("uid").is(uid));
      if (minDate != null)
         list.add(Criteria.where("countDay").gte(minDate));
      if (maxDate != null)
         list.add(Criteria.where("countDay").lt(maxDate));
      Query query = new Query();
      if (list.size() > 0) {
         Criteria[] cas = new Criteria[list.size()];
         for (int i = 0; i < list.size(); i++)
            cas[i] = list.get(i);
         query.addCriteria(new Criteria().andOperator(cas));
      }
      Map<String, Object> map = new HashMap<>();
      map.put("directOrderNum", 0);
      map.put("inDirectOrderNum", 0);
      map.put("beyondOrderNum", 0);
      BasicDBObject initial = new BasicDBObject(map);
      // 进行按天、周、月分组
      BasicDBObject agg = new BasicDBObject("uid", "");
      DBCollection collection = mongoTemplate.getCollection(collectionName);
      GroupCommand xx = new GroupCommand(collection, agg, query.getQueryObject(), initial, getTeamOrderNumReduce(),
            null);
      BasicDBList objects = (BasicDBList) collection.group(xx);
      List<OrderMoneyDailyCount> results = new ArrayList<>();
      if (objects != null) {
         for (int i = 0; i < objects.size(); i++) {
            BasicDBObject dbObject = (BasicDBObject) objects.get(i);
            if (dbObject == null) {
               continue;
            }
            Object object = dbObject.get("uid");
            if (object == null) {
               continue;
            }
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            dailyCount.setDirectOrderNum(new BigDecimal(dbObject.get("directOrderNum").toString()).intValue());
            dailyCount.setInDirectOrderNum(new BigDecimal(dbObject.get("inDirectOrderNum").toString()).intValue());
            dailyCount.setBeyondOrderNum(new BigDecimal(dbObject.get("beyondOrderNum").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
   /**
    * 根据订单排行榜进行uid分组订单数量排序
    * @param uid
    * @param minDate
    * @param maxDate
    * @return
    */
   public List<OrderRankingVO> getRankingByOrderNum(Long uid, Date minDate, Date maxDate) {
      LookupOperation lookupToLots = LookupOperation.newLookup().from("order_money_daily_count").// 关联表名,多方
            localField("workerUid").// 主表关联字段
            foreignField("uid").// 次表字段关联字段
            as("orders"); // 次表的别名
      // 查询条件
      List<Criteria> list = new ArrayList<Criteria>();
      list.add(Criteria.where("bossUid").is(uid));
      list.add(Criteria.where("orders.orderNum").gt(0));
      if (minDate != null) {
         minDate = DateUtil.reduceDay(minDate, 1);
         list.add(Criteria.where("orders.countDay").gt(minDate));
      }
      if (maxDate != null) {
         maxDate = DateUtil.reduceDay(maxDate, 1);
         list.add(Criteria.where("orders.countDay").lte(maxDate));
      }
      // 转换数组
      Criteria[] cas = new Criteria[list.size()];
      for (int i = 0; i < list.size(); i++)
         cas[i] = list.get(i);
      // 查询参数
      Criteria criteria = new Criteria().andOperator(cas);
      List<AggregationOperation> aggs = new ArrayList<>();
      // 左连接
      aggs.add(lookupToLots);
      // 拆分子数组
      aggs.add(Aggregation.unwind("orders"));
      // 条件匹配
      aggs.add(Aggregation.match(criteria));
      // 需要返回的字段
      aggs.add(Aggregation.project().and("workerUid").as("workerUid").and("level").as("level").and("orders.orderNum")
            .as("number"));
      // 分组求和并返回
      aggs.add(Aggregation.group("workerUid").first("workerUid").as("workerUid").first("level").as("level")
            .sum("number").as("number"));
      // 排序
      aggs.add(Aggregation.sort(new Sort(Sort.Direction.DESC, "number")));
      aggs.add(Aggregation.limit(10));
      // 组织条件
      Aggregation agg = Aggregation.newAggregation(aggs);
      // 执行查询
      AggregationResults<BasicDBObject> results = mongoTemplate.aggregate(agg, "threeSaleDetail",
            BasicDBObject.class);
      // 返回结果处理
      List<BasicDBObject> livevideo = results.getMappedResults();
      List<OrderRankingVO> resultList = new ArrayList<>();
      for (BasicDBObject obj : livevideo) {
         Object object = obj.get("workerUid");
         if (object == null) {
            continue;
         }
         OrderRankingVO vo = new OrderRankingVO();
         vo.setUid(new BigDecimal(obj.get("workerUid").toString()).longValue());
         vo.setGrade(new BigDecimal(obj.get("level").toString()).intValue());
         vo.setNumber(new BigDecimal(obj.get("number").toString()).intValue());
         resultList.add(vo);
      }
      return resultList;
   }
}