From fb885c8bff26484f2bb21e697f182cc35bc4fa63 Mon Sep 17 00:00:00 2001 From: yujian <yujian@163.com> Date: 星期二, 12 五月 2020 15:27:08 +0800 Subject: [PATCH] 2.1.1 新需求 --- fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java | 337 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 287 insertions(+), 50 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java b/fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java index dd77db7..f141f17 100644 --- a/fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java +++ b/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,284 @@ return mongoTemplate.find(query, OrderMoneyDailyCount.class); } + /** + * 缁熻鎴戠殑閲戦璁㈠崟鏁伴噺-- 鏉ユ簮鍒嗙粍缁熻 + * + * @param uid + * @param minDate + * @param maxDate + * @return + */ + public List<OrderMoneyDailyCount> sumGroupBySourceType(Long uid, Date minDate, Date maxDate) { + String collectionName = "order_money_daily_count"; + 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) { + String collectionName = "order_money_daily_count"; + 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; + } } -- Gitblit v1.8.0