HumitureManagerImpl.java 4.7 KB
package com.myproject.manager.impl;

import com.google.common.collect.TreeBasedTable;
import com.myproject.bean.search.PageList;
import com.myproject.bean.update.Humiture;
import com.myproject.dao.mongo.IHumitureDao;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IHumitureManager;
import com.myproject.util.DateUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;


@Service
public class HumitureManagerImpl implements IHumitureManager {

    @Autowired
    protected IHumitureDao humitureDao;

    protected final transient Logger log = LogManager.getLogger(getClass());

    @Override
    public Humiture get(String id) {
        return humitureDao.findOneById(id);
    }

    @Override
    public Humiture save(Humiture object) throws ValidateException {
        return humitureDao.save(object);
    }

    @Override
    public void delete(Humiture object) throws ValidateException {
        humitureDao.removeOne(object);
    }

    @Override
    public List<Humiture> findAll() {
        return humitureDao.findAll();
    }

    @Override
    public PageList findByQuery(Query query, PageList pageList) {
        pageList.setList(humitureDao.findByQuery(query, pageList.getPageNumber(), pageList.getObjectsPerPage()));
        pageList.setFullListSize(humitureDao.countByQuery(query));
        return pageList;
    }

    @Override
    public void validate(Humiture object, List errors) {

    }

    @Override
    public List<Humiture> latest(String cid, int days) {
        long time = System.currentTimeMillis() - days * 24 * 60 * 60 * 1000L;
        Query query = Query.query(Criteria.where("cid").is(cid).and("createDate").gt(new Date(time)));
        return humitureDao.findByQuery(query);
    }

    @Override
    public TreeBasedTable<String, String, Humiture> getChartData(Date fromDate, Date toDate){
        //Date addOneDayToTime = DateUtil.addOneDayNoTime(toDate);
        Criteria c = new Criteria().andOperator(Criteria.where("createDate").gte(fromDate),
                Criteria.where("createDate").lt(toDate));
        Query query = Query.query(c);
        List<Humiture> results = humitureDao.findByQuery(query);
        TreeBasedTable<String, String, Humiture> resultTable = TreeBasedTable.create();
        long intevalTime = 4 * 1000;
        String timeMask = "yyyy-MM-dd HH:mm:ss";
        for (Humiture humiture: results) {
            String boxKey = humiture.getCid();
            //分钟数取整,如08分变成05分,方便图形显示时分组
            try{
                float humidity = Float.valueOf(humiture.getHumidity());
                if(humidity > 0){
                    long createTime = humiture.getCreateDate().getTime() / intevalTime * intevalTime;
                    String timeStr = DateUtil.toDateString(createTime, timeMask);
                    float newHum = humidity - 9;
                    humiture.setHumidity(String.format("%.1f",newHum));
                    resultTable.put(boxKey,timeStr,humiture);
                }
            }catch (Exception ex){

            }
        }

        Set<String> allBoxes = resultTable.rowKeySet();

        long fromTime = fromDate.getTime() / intevalTime * intevalTime;
        for (long time = fromTime; time<= toDate.getTime(); time= time + intevalTime){
            String timeStr = DateUtil.toDateString(time,timeMask);

            for (String cidBoxKey : allBoxes){
                Humiture value = resultTable.get(cidBoxKey, timeStr);
                if(value == null){
                    resultTable.put(cidBoxKey,timeStr,new Humiture());
                }
            }
        }
        //压缩到一半的时间
        long newToTime = toDate.getTime();
        long newFromTime = toDate.getTime() - (newToTime - fromDate.getTime())/2;
        newFromTime = newFromTime/intevalTime * intevalTime;
        intevalTime = intevalTime /2;
        TreeBasedTable<String, String, Humiture> newResult = TreeBasedTable.create();
        for (Map.Entry<String, Map<String, Humiture>> columnEntry : resultTable.columnMap().entrySet()) {
            newFromTime = newFromTime + intevalTime;
            String timeStr = DateUtil.toDateString(newFromTime,timeMask);
            for (Map.Entry<String, Humiture> humitureEntry : columnEntry.getValue().entrySet()) {
                Humiture humiture = humitureEntry.getValue();
                newResult.put(humitureEntry.getKey(),timeStr, humiture);
            }
        }

        return newResult;
    }


}