package com.yeshi.makemoney.app.service.impl.goldcorn;
|
|
import com.yeshi.makemoney.app.dao.goldcorn.GoldCornGetRecordDao;
|
import com.yeshi.makemoney.app.dao.goldcorn.GoldCornGetRecordDao.DaoQuery;
|
import com.yeshi.makemoney.app.entity.SystemEnum;
|
import com.yeshi.makemoney.app.entity.goldcorn.GoldCornGetRecord;
|
import com.yeshi.makemoney.app.entity.goldcorn.GoldCornGetType;
|
import com.yeshi.makemoney.app.exception.goldcorn.GoldCornGetRecordException;
|
import com.yeshi.makemoney.app.service.inter.goldcorn.GoldCornGetRecordService;
|
import com.yeshi.makemoney.app.service.query.goldcorn.GoldCornGetRecordQuery;
|
import com.yeshi.makemoney.app.utils.goldcorn.GoldCornUtil;
|
import org.springframework.data.domain.Sort;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
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.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.stereotype.Service;
|
import org.yeshi.utils.TimeUtil;
|
import org.yeshi.utils.statistic.BaseStatisticTimeQuery;
|
import org.yeshi.utils.statistic.StatisticNumberResult;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class GoldCornGetRecordServiceImpl implements GoldCornGetRecordService {
|
|
@Resource
|
private GoldCornGetRecordDao goldCornGetRecordDao;
|
|
private DaoQuery createDaoQuery(GoldCornGetRecordQuery goldCornGetRecordQuery) {
|
DaoQuery daoQuery = new DaoQuery();
|
daoQuery.type = goldCornGetRecordQuery.getType();
|
daoQuery.uid = goldCornGetRecordQuery.getUid();
|
daoQuery.day = goldCornGetRecordQuery.getDay();
|
daoQuery.doubles = goldCornGetRecordQuery.getDoubles();
|
daoQuery.dayList = goldCornGetRecordQuery.getDayList();
|
daoQuery.minCreateTime = goldCornGetRecordQuery.toStartTime();
|
daoQuery.maxCreateTime = goldCornGetRecordQuery.toEndTime();
|
return daoQuery;
|
}
|
|
@Override
|
public List<GoldCornGetRecord> list(GoldCornGetRecordQuery goldCornGetRecordQuery, int page, int pageSize) {
|
DaoQuery daoQuery = createDaoQuery(goldCornGetRecordQuery);
|
|
daoQuery.start = (page - 1) * pageSize;
|
daoQuery.count = pageSize;
|
daoQuery.sortList = Arrays.asList(new Sort.Order[]{Sort.Order.desc("createTime")});
|
return goldCornGetRecordDao.list(daoQuery);
|
}
|
|
@Override
|
public long count(GoldCornGetRecordQuery goldCornGetRecordQuery) {
|
DaoQuery daoQuery = createDaoQuery(goldCornGetRecordQuery);
|
return goldCornGetRecordDao.count(daoQuery);
|
}
|
|
@Override
|
public GoldCornGetRecord get(String id) {
|
Query query = new Query();
|
query.addCriteria(Criteria.where("_id").is(id));
|
return goldCornGetRecordDao.findOne(query);
|
}
|
|
@Override
|
public void add(GoldCornGetRecord goldCornGetRecord) throws GoldCornGetRecordException {
|
|
if (goldCornGetRecord.getCreateTime() == null) {
|
goldCornGetRecord.setCreateTime(new Date());
|
}
|
|
goldCornGetRecord.setId(goldCornGetRecord.toId());
|
|
//查询主键ID是否存在
|
if (goldCornGetRecordDao.get(goldCornGetRecord.getId()) != null) {
|
throw new GoldCornGetRecordException(GoldCornGetRecordException.CODE_EXIST, "已存在");
|
}
|
|
|
//保存
|
goldCornGetRecordDao.save(goldCornGetRecord);
|
}
|
|
@Override
|
public void update(GoldCornGetRecord goldCornGetRecord) {
|
if (goldCornGetRecord.getUpdateTime() == null) {
|
goldCornGetRecord.setUpdateTime(new Date());
|
}
|
//更新
|
goldCornGetRecordDao.updateSelective(goldCornGetRecord);
|
}
|
|
@Override
|
public Long getGoldCornByDay(Long uid, Date day) {
|
List<Criteria> andList = new ArrayList<>();
|
if (uid != null) {
|
andList.add(Criteria.where("uid").is(uid));
|
}
|
|
if (day != null) {
|
andList.add(Criteria.where("day").is(GoldCornUtil.getFormatDay(day)));
|
}
|
|
Criteria[] ands = new Criteria[andList.size()];
|
andList.toArray(ands);
|
List<AggregationOperation> list = new ArrayList<>();
|
if (ands.length > 0) {
|
list.add(Aggregation.match(new Criteria().andOperator(ands)));
|
}
|
list.add(Aggregation.group().sum("cornNum").as("goldcorn"));
|
AggregationResults<Map> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
return results.getUniqueMappedResult() == null ? 0L : Long.parseLong(results.getUniqueMappedResult().get("goldcorn") + "");
|
}
|
|
@Override
|
public List<Long> getUidsByDay(String day, int page, int pageSize) {
|
List<Long> uidList = new ArrayList<>();
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(Criteria.where("day").is(day)));
|
list.add(Aggregation.group("uid"));
|
list.add(Aggregation.project("uid"));
|
list.add(Aggregation.skip((long) ((page - 1) * pageSize)));
|
list.add(Aggregation.limit((long) pageSize));
|
AggregationResults<Map> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
List<Map> resultList = results.getMappedResults();
|
if (resultList != null) {
|
for (Map map : resultList) {
|
uidList.add(Long.parseLong(map.get("_id") + ""));
|
}
|
}
|
return uidList;
|
}
|
|
@Override
|
public long countUidsByDay(String day) {
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(Criteria.where("day").is(day)));
|
list.add(Aggregation.group("uid"));
|
list.add(Aggregation.group().count().as("count"));
|
AggregationResults<Map> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
return results.getUniqueMappedResult() == null ? 0L : Long.parseLong(results.getUniqueMappedResult().get("count") + "");
|
}
|
|
@Override
|
public Map<Long, Integer> sumGoldCornByFromUids(Long uid, List<Long> fromUidList, String day) {
|
if (fromUidList == null || fromUidList.size() == 0) {
|
return new HashMap<>();
|
}
|
Criteria[] ands = new Criteria[3];
|
ands[0] = Criteria.where("day").is(day);
|
ands[1] = Criteria.where("uid").is(uid);
|
|
Criteria[] ors = new Criteria[fromUidList.size()];
|
for (int i = 0; i < ors.length; i++) {
|
ors[i] = Criteria.where("fromUid").is(fromUidList.get(i));
|
}
|
ands[2] = new Criteria().orOperator(ors);
|
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(new Criteria().andOperator(ands)));
|
list.add(Aggregation.group("fromUid").sum("cornNum").as("cornNum"));
|
AggregationResults<Map> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
List<Map> mapList = results.getMappedResults();
|
Map<Long, Integer> map = new HashMap<>();
|
if (mapList != null) {
|
for (Map m : mapList) {
|
map.put((long) m.get("_id"), (int) m.get("cornNum"));
|
}
|
}
|
return map;
|
}
|
|
@Override
|
public int getContinueDay(Long uid, GoldCornGetType type, Date deadDate) {
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(Criteria.where("uid").is(uid).and("type").is(type).and("createTime").lte(deadDate)));
|
list.add(Aggregation.group("day").max("createTime").as("createTime"));
|
list.add(Aggregation.sort(Sort.Direction.DESC, "createTime"));
|
//最大限制为365天
|
list.add(Aggregation.limit(365));
|
list.add(Aggregation.project("day"));
|
AggregationResults<Map<String, String>> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
List<Map<String, String>> resultList = results.getMappedResults();
|
//获取连续的天数
|
String format = "yyyy-MM-dd";
|
Date lastDay = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(deadDate.getTime(), format), format));
|
int continueDay = 0;
|
for (Map<String, String> day : resultList) {
|
Long timestamp = TimeUtil.convertToTimeTemp(day.get("_id"), format);
|
long cha = lastDay.getTime() - timestamp;
|
if (cha <= 1000 * 60 * 60 * 24L) {
|
continueDay++;
|
} else {
|
break;
|
}
|
lastDay = new Date(timestamp);
|
}
|
return continueDay;
|
}
|
|
@Override
|
public Map<GoldCornGetType, Long> sumEventCount(GoldCornGetRecordQuery goldCornGetRecordQuery) {
|
return goldCornGetRecordDao.sumEventCount(createDaoQuery(goldCornGetRecordQuery));
|
}
|
|
@Override
|
public Map<String, Long> sumGoldCornNum(GoldCornGetRecordQuery goldCornGetRecordQuery) {
|
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(goldCornGetRecordDao.getCriteria(createDaoQuery(goldCornGetRecordQuery))));
|
list.add(Aggregation.group("day").sum("cornNum").as("cornNum"));
|
AggregationResults<Map<String, Object>> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
List<Map<String, Object>> resultList = results.getMappedResults();
|
Map<String, Long> resultMap = new HashMap<>();
|
for (Map<String, Object> result : resultList) {
|
String day = result.get("_id") + "";
|
Long count = Long.parseLong(result.get("cornNum") + "");
|
resultMap.put(day, count);
|
}
|
return resultMap;
|
}
|
|
@Override
|
public List<Long> listUids(Date minCreateTime, Date maxCreateTime, int page, int pageSize) {
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(Criteria.where("createTime").gte(minCreateTime).lt(maxCreateTime)));
|
list.add(Aggregation.group("uid"));
|
list.add(Aggregation.sort(Sort.Direction.DESC, "_id"));
|
list.add(Aggregation.skip(Long.parseLong((page - 1) * pageSize + "")));
|
list.add(Aggregation.limit(pageSize));
|
AggregationResults<Map<String, Object>> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
List<Map<String, Object>> resultList = results.getMappedResults();
|
List<Long> uidList = new ArrayList<>();
|
for (Map<String, Object> result : resultList) {
|
Long uid = Long.parseLong(result.get("_id") + "");
|
uidList.add(uid);
|
}
|
return uidList;
|
}
|
|
@Override
|
public Map<Long, Boolean> isSignIned(List<Long> uidList, String day) {
|
DaoQuery daoQuery = new DaoQuery();
|
daoQuery.type = GoldCornGetType.signIn;
|
daoQuery.day = day;
|
daoQuery.uidList = uidList;
|
|
List<AggregationOperation> list = new ArrayList<>();
|
list.add(Aggregation.match(goldCornGetRecordDao.getCriteria(daoQuery)));
|
list.add(Aggregation.group("uid"));
|
|
|
AggregationResults<Map<String, Object>> results = goldCornGetRecordDao.aggregate(list, Map.class);
|
List<Map<String, Object>> resultList = results.getMappedResults();
|
Set<Long> signInedList = new HashSet<>();
|
for (Map<String, Object> result : resultList) {
|
Long uid = Long.parseLong(result.get("_id") + "");
|
signInedList.add(uid);
|
}
|
|
return uidList.stream().collect(Collectors.toMap(uid -> uid, uid -> signInedList.contains(uid)));
|
}
|
|
@Override
|
public List<StatisticNumberResult> statistic(SystemEnum system, BaseStatisticTimeQuery query) {
|
GoldCornGetRecordQuery q = new GoldCornGetRecordQuery();
|
q.setStartTime(TimeUtil.getGernalTime(query.getStartTime().getTime(), "yyyy.MM.dd HH:mm:ss"));
|
q.setEndTime(TimeUtil.getGernalTime(query.getEndTime().getTime(), "yyyy.MM.dd HH:mm:ss"));
|
q.setFormat("yyyy.MM.dd HH:mm:ss");
|
Map<String, Long> map = sumGoldCornNum(q);
|
List<StatisticNumberResult> resultList = new ArrayList<>();
|
for (String key : map.keySet()) {
|
StatisticNumberResult numberResult = new StatisticNumberResult();
|
numberResult.setTime(key);
|
numberResult.setNumber(map.get(key));
|
resultList.add(numberResult);
|
}
|
|
Comparator<StatisticNumberResult> cm = (o1, o2) ->
|
GoldCornUtil.convertFormatDay(o1.getTime()).getTime() - GoldCornUtil.convertFormatDay(o2.getTime()).getTime() > 0 ? 1 : -1;
|
|
Collections.sort(resultList, cm);
|
return resultList;
|
}
|
|
|
}
|