#
vincentlu
2 小时以前 3bb3a6268339027643b3e85b5162f78788b30086
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
@@ -1,5 +1,6 @@
package com.zy.acs.manager.core.service;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.Code;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.entity.Sta;
@@ -9,9 +10,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Objects;
// man_segment: start_time, end_time
// man_segment: start_time, end_time, alter table man_segment
//    add roller_waiting int(1) default 0 null comment '滚筒线等待' after end_time;
/**
 * alter table man_sta
 *     add capacity int null comment '槽位数' after angle;
@@ -29,6 +32,9 @@
@Service
public class TransferStationHandler {
    private static final long LOAD_DELAY_MS  = 15000L; // load ( inbound ) delay timeout
    private static final long PLACE_DELAY_MS  = 15000L; // place ( outbound ) delay timeout
    @Autowired
    private SegmentService segmentService;
    @Autowired
@@ -41,15 +47,16 @@
    private StaService staService;
    /**
     *
     * 取货(入库):在取完第一个货的时候,担心滚筒输送线会有下一个货物,所以建议AGV在原地等待一段时间
     * 放货(出库):可能此时AGV上面其他背篓的料箱也是出库到这个滚筒输送线,所以等输送线把第一个料箱运走之后,再放第二个
     * 要做 ready-for-next
     */
    // return is need wait
    public boolean hasDelayAtSta(Segment segment) {
        if (segment == null) {
    public boolean hasDelayAtSta(Segment currSeg) {
        if (currSeg == null) {
            throw new NullPointerException("segment is null in hasDelayAtSta.");
        }
        // 判断AGV是否在滚动输送线前
        Code currentCode = agvDetailService.getCurrentCode(segment.getAgvId());
        Code currentCode = agvDetailService.getCurrentCode(currSeg.getAgvId());
        if (null == currentCode) {
            return false;
        }
@@ -58,15 +65,60 @@
            return false;
        }
        // 如果为第一个segment(没有previous segment),则不需要等待
        Segment preSeg = segmentService.getPreviousStepOfFinish(segment.getTravelId(), segment.getSerial());
        if (preSeg == null) {
        Segment preSeg = segmentService.getPreviousStepOfFinish(currSeg.getTravelId(), currSeg.getSerial());
        if (preSeg == null || null == preSeg.getEndTime()) {
            return false;
        }
        Date preSegEndTime = preSeg.getEndTime();
        if (null == preSegEndTime) {
        TaskPosDto.PosType currPosType = TaskPosDto.PosType.of(currSeg.getPosType());
        TaskPosDto.PosType prePosType = TaskPosDto.PosType.of(preSeg.getPosType());
        if (prePosType == null || currPosType == null) {
            return false;
        }
        Date now = new Date();
        long preEndTime = preSeg.getEndTime().getTime();
        long now = System.currentTimeMillis();
        Long agvId = currSeg.getAgvId();
        // inbound
        if (prePosType.equals(TaskPosDto.PosType.ORI_STA)) {
            // 背篓未满才等
            Integer backpack = agvService.getBackpack(agvId);
            List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
            if (usedBackpacks.size() >= backpack) {
                return false;
            }
            // sign waiting
            if (currSeg.getRollerWaiting() == 0) {
                currSeg.setRollerWaiting(1);
                segmentService.updateById(currSeg);
            }
            // timeout
            return (now - preEndTime) < LOAD_DELAY_MS;
        }
        // outbound
        if (prePosType == TaskPosDto.PosType.DEST_STA) {
            // 连续同口才等
            if (currPosType != TaskPosDto.PosType.DEST_STA) {
                return false;
            }
            if (!Objects.equals(preSeg.getEndNode(), currSeg.getEndNode())) {
                return false;
            }
            // sign waiting
            if (currSeg.getRollerWaiting() == 0) {
                currSeg.setRollerWaiting(1);
                segmentService.updateById(currSeg);
            }
            // timeout
            return (now - preEndTime) < PLACE_DELAY_MS;
        }
        return false;
    }