DataLogDaoImpl.java 8.9 KB
package com.myproject.dao.mongo.impl;

import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.update.DataLog;
import com.myproject.dao.mongo.AbstractMongoDao;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.util.DateUtil;
import com.myproject.util.StorageConstants;
import org.apache.logging.log4j.util.Strings;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
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.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


@Repository
public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {

    @Override
    public Class getEntityClass() {
        return DataLog.class;
    }

    @Override
    public List<DataLog> latestLogs(int count){
        Query query = new Query();
        query.with(new Sort(Sort.Direction.DESC,"updateDate"));
        query.limit(count);
        return getMongoTemplate().find(query,getEntityClass());
    }

    @Override
    public DataLog findLatestOutTask(String barcode){
        Criteria c = new Criteria();
        c.and("barcode").is(barcode).and("type").is(StorageConstants.OP.CHECKOUT);
        Query query = new Query(c);
        query.with(new Sort(Sort.Direction.DESC,"updateDate"));
        DataLog task = findOne(query);
        return task;
    }

    @Override
    public List<DataLog> storageHistory(String cid, Date fromDate){
        Criteria c = new Criteria();
        c.and("cid").is(cid).and("updateDate").gte(fromDate);
        Query query = new Query(c);
        query.with(new Sort(Sort.Direction.DESC,"updateDate"));
        return getMongoTemplate().find(query,getEntityClass());
    }

    @Override
    public List<ChartItem> putInChart(Date fromTime, Date toTime,String partNumber){
        return chart(fromTime, toTime, StorageConstants.OP.PUT_IN,partNumber);
    }

    @Override
    public List<ChartItem> checkOutChart(Date fromTime, Date toTime,String partNumber){
        return chart(fromTime, toTime, StorageConstants.OP.CHECKOUT,partNumber);
    }

    private List<ChartItem> chart(Date fromTime, Date toTime, int type, String partNumber){
        Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
        Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
                Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type);
        c.and("status").in(StorageConstants.OP_STATUS.END.name(),StorageConstants.OP_STATUS.FINISHED.name());
        if(Strings.isNotBlank(partNumber)){
            c.and("partNumber").is(partNumber);
        }
        Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(c),
                Aggregation.project().and("updateDate").extractDayOfYear().as("label"),
                Aggregation.group("label").count().as("value"),
                Aggregation.project("value").and("label").previousOperation()
        );
        AggregationResults<ChartItem> results = getMongoTemplate().aggregate(agg, getEntityClass(), ChartItem.class);
        return results.getMappedResults();
    }



    /**
     * 获取最后一次出库记录
     */
    @Override
    public DataLog findLastOut(String areaId, String barcode){
        Query query = Query.query(Criteria.where("barcode").is(barcode)//二维码
                .and("areaId").is(areaId)//区域
                .and("type").is(StorageConstants.OP.CHECKOUT)//出库
                .and("status").is(StorageConstants.OP_STATUS.FINISHED.name()));//已完成
        query.with(new Sort(Sort.Direction.DESC, "updateDate"));
        return findOne(query);
    }

    private List<DataLog> findUnExecuteTasks(String executingHSerial) {
        Criteria c = Criteria.where("appendInfo.hSerial").ne(executingHSerial).and("status").in(StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.PAUSE.name());
        Query query = Query.query(c);
        List<DataLog> feederTasks = findByQuery(query);
        if(feederTasks == null){
           feederTasks = new ArrayList<>();
        }
        return feederTasks;
    }

    @Override
    public List<DataLog> findUnFinishedTasks(String executingHSerial){
        //Criteria c = Criteria.where("appendInfo.hSerial").is(executingHSerial).and("lessSendReel").is(false).and("status").nin(StorageConstants.OP_STATUS.FINISHED.name(),StorageConstants.OP_STATUS.CANCEL.name());

        Criteria c = Criteria.where("status").nin(StorageConstants.OP_STATUS.FINISHED.name(),StorageConstants.OP_STATUS.CANCEL.name()).and("stopSendToQisda").is(false);
        //只查找近12个小时未完成的任务
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.HOUR_OF_DAY,-12);
        c.and("createDate").gte(calendar.getTime());
        Query query = Query.query(c);
        List<DataLog> unFinishedTasks = findByQuery(query);
        if(unFinishedTasks == null){
            unFinishedTasks = new ArrayList<>();
        }
//        List<DataLog> unExecuteTasks = findUnExecuteTasks(executingHSerial);
//        for (DataLog unExecuteTask : unExecuteTasks) {
//            unFinishedTasks.add(unExecuteTask);
//        }
        return unFinishedTasks;
    }

    @Override
    public List<InventoryItem> getStorageLockCount(String storageId){
        //被锁定的仓位
        Criteria c = Criteria.where("sourceType").is(StorageConstants.TASK_SOURCE.FEEDER.name()).and("storageId").is(storageId)
                .and("status").in(StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.PAUSE.name());
        Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(c),
                Aggregation.group("partNumber").count().as("lockReel"),
                Aggregation.project("lockReel").and("partNumber").previousOperation()
        );
        AggregationResults<InventoryItem> results = getMongoTemplate().aggregate(agg, getEntityClass(), InventoryItem.class);
        return results.getMappedResults();
    }

    @Override
    public int unExecuteFeederTaskCount(String feederId){
        Query query = Query.query(Criteria.where("sourceId").is(feederId)
            .and("sourceType").is(StorageConstants.TASK_SOURCE.FEEDER.name())
            .and("status").in(StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.PAUSE.name()));
        return super.countByQuery(query);
    }

    @Override
    public void changeUnExeCuteTaskStatus(StorageConstants.TASK_SOURCE taskSource, String sourceId, StorageConstants.OP_STATUS op_status){
        Query query = Query.query(Criteria.where("sourceId").is(sourceId)
                .and("sourceType").is(taskSource.name())
                .and("status").in(StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.PAUSE.name()));
        Update update = Update.update("status", op_status.name());
        updateMulti(query,update);
    }

    @Override
    public DataLog findTask(String cid, String posName) {
        Query query = Query.query(Criteria.where("cid").is(cid).and("posName").is(posName));
        query.with(new Sort(Sort.Direction.DESC,"updateDate"));
        return findOne(query);
    }

    @Override
    public List<DataLog> findByFeedPosId(String feederPosId) {
        Query query = Query.query(Criteria.where("subSourceId").is(feederPosId)
                .and("sourceType").is(StorageConstants.TASK_SOURCE.FEEDER.name()));
        List<DataLog> feederTasks = findByQuery(query);
        if(feederTasks == null){
            feederTasks = new ArrayList<>();
        }
        return feederTasks;
    }

    @Override
    public List<DataLog> findHistory(String barcode, Date startDate, Date endDate) {
        Criteria c = new Criteria();
        if(barcode != null && !barcode.isEmpty()){
            c.and("barcode").is(barcode);
        }
        if(startDate != null){
            c.and("createDate").gte(startDate);
        }

        if(endDate != null){
            c.and("updateDate").lte(endDate);
        }
        return findByQuery(Query.query(c));
    }

    @Override
    public List<DataLog> findHistory(String barcode, int num) {
        Criteria c = new Criteria();
        if(barcode != null && !barcode.isEmpty()){
            c.and("barcode").is(barcode);
        }
        //if(startDate != null){
        //    c.and("createDate").gte(startDate);
        //}

//        if(endDate != null){
//            c.and("updateDate").lte(endDate);
//        }
        Query q = Query.query(c);
        q.limit(num);
        q.with(new Sort(Sort.Direction.DESC, "updateDate"));
        return findByQuery(q);
    }

}