From 28cf328a098334b51a3e9d2d56f983fb8c862211 Mon Sep 17 00:00:00 2001 From: yujian <yujian@163.com> Date: 星期六, 23 五月 2020 09:54:38 +0800 Subject: [PATCH] 足迹、收藏订单兼容新需求 --- fanli/src/main/java/com/yeshi/fanli/dao/order/OrderMoneyDailyCountDao.java | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 298 insertions(+), 2 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 5fb7f62..9a306d7 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 @@ -11,10 +11,15 @@ 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; @@ -24,6 +29,8 @@ 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> { @@ -56,6 +63,12 @@ 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); } @@ -126,6 +139,10 @@ 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())) { @@ -191,8 +208,10 @@ SourceTypeEnum[] arrayEnun = SourceTypeEnum.values(); for (int i = 0; i < mapResult.size(); i++) { BasicDBObject object = mapResult.get(i + ""); - OrderMoneyDailyCount dailyCount = new OrderMoneyDailyCount(); - + 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())) { @@ -200,6 +219,7 @@ 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()); @@ -510,4 +530,280 @@ 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; + } + + + + /** + * 鏍规嵁璁㈠崟鎺掕姒滆繘琛寀id鍒嗙粍璁㈠崟鏁伴噺鎺掑簭 + * @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)); + 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; + } } -- Gitblit v1.8.0