admin
2020-05-12 2ec42a5aacea35d2918f0e17f07685cf5b4d25c8
fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java
@@ -1,8 +1,14 @@
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 javax.annotation.Resource;
@@ -19,9 +25,12 @@
import com.mongodb.DBObject;
import com.mongodb.GroupCommand;
import com.yeshi.fanli.entity.order.OrderMoneyDailyCount;
import com.yeshi.fanli.entity.order.OrderMoneyDailyCount.SourceTypeEnum;
@Repository
public class OrderMoneyDailyCountDao {
   private static String collectionName = "order_money_daily_count";
   @Resource
   private MongoTemplate mongoTemplate;
@@ -95,56 +104,282 @@
      return mongoTemplate.find(query, OrderMoneyDailyCount.class);
   }
   /**
    * 统计我的金额订单数量-- 来源分组统计
    *
    * @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 += parseFloat((Math.round((doc.income)*100)/100).toFixed(2));"
            + " 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 + "");
            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()));
            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 += parseFloat((Math.round((doc.incomeTeam)*100)/100).toFixed(2));"
            + " 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 + "");
            OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount();
            SourceTypeEnum sourceTypeEnum = null;
            for (int m = 0; m < arrayEnun.length; m++) {
               if (arrayEnun[m].name().equals(object.get("sourceType").toString())) {
                  sourceTypeEnum = arrayEnun[m];
                  break;
               }
            }
            dailyCount.setSourceType(sourceTypeEnum);
            dailyCount.setIncome(new BigDecimal(object.get("totalIncome").toString()));
            dailyCount.setOrderNum(new BigDecimal(object.get("totalNum").toString()).intValue());
            listDailyCount.add(dailyCount);
         }
      }
      return listDailyCount;
   }
   
//
//   public List<PlaybackEntity> queryPlaybackRecord(FunctionUseQueryEntity queryEntity) {
//      Criteria criteria = Criteria.where("createTime").gte(queryEntity.getStartTime()).lte(queryEntity.getEndTime())
//            .and("status").is(1);
//      Query query = Query.query(criteria);
//
//      BasicDBObject initial = new BasicDBObject();
//      initial.put("playbackNum", 0);
//
//      String reduce = getReduce();
//      // 进行按天、周、月分组
//      String keyf = getKeyf(queryEntity);
//
//      DBCollection collection = mongoTemplate.getCollection(COLLNAME);
//
//      GroupCommand xx = new GroupCommand(collection, keyf, query.getQueryObject(), initial, reduce, null);
//
//      BasicDBList objects = (BasicDBList) collection.group(xx);
//
//      List<PlaybackEntity> results = new ArrayList<PlaybackEntity>();
//      if (objects != null) {
//         for (int i = 0; i < objects.size(); i++) {
//            PlaybackEntity play = new PlaybackEntity();
//            DBObject obj = (DBObject) objects.get(i);
//            play.setFormateTime((String) obj.get("strData"));
//            play.setPlaybackNum((Double) obj.get("playbackNum"));
//            results.add(play);
//         }
//      }
//      return results;
//   }
//
//   private String getKeyf(FunctionUseQueryEntity queryEntity) {
//      StringBuilder keyfBuilder = new StringBuilder();
//      keyfBuilder.append("function(doc){ ").append("    var date = new Date(doc.createTime); ");
//      if (DateTypeEnum.DATE.getValue().equals(queryEntity.getType())) {
//         keyfBuilder.append(
//               "    var dateKey = '' + date.getFullYear()+ '-' + (date.getMonth()+1) + '-' + date.getDate();");
//      } else if (DateTypeEnum.MONTH.getValue().equals(queryEntity.getType())) {
//         keyfBuilder.append("    var dateKey = '' + date.getFullYear()+ '-' + (date.getMonth()+1);");
//      }
//      keyfBuilder.append("    return {'strData':dateKey};  ").append(" }");
//      return keyfBuilder.toString();
//   }
//
//   private String getReduce() {
//      StringBuilder reduceBuilder = new StringBuilder();
//      reduceBuilder.append("function Reduce(doc, out) { ").append("    out.playbackNum += 1; ").append(" }");
//      return reduceBuilder.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()));
               dailyCount.setOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
               dailyCount.setIncomeTeam(new BigDecimal(dbObject.get("totalIncomeTeam").toString()));
               dailyCount.setOrderNumTeam(new BigDecimal(dbObject.get("totalNumTeam").toString()).intValue());
               results.add(dailyCount);
            } catch (ParseException e) {
               e.printStackTrace();
               continue;
            }
         }
      }
      return results;
   }
   private String getReduce() {
      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> 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()));
            dailyCount.setOrderNum(new BigDecimal(dbObject.get("totalNum").toString()).intValue());
            dailyCount.setIncomeTeam(new BigDecimal(dbObject.get("totalIncomeTeam").toString()));
            dailyCount.setOrderNumTeam(new BigDecimal(dbObject.get("totalNumTeam").toString()).intValue());
            results.add(dailyCount);
         }
      }
      return results;
   }
}