#
vincentlu
2025-12-30 b781dc511b21b80b14befe87d42eced1cce59d1f
#
10个文件已修改
150 ■■■■ 已修改文件
version/doc/RCS输送线逻辑梳理.xmind 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/mapper/manager/StaMapper.xml 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/RCSÊäËÍÏßÂß¼­ÊáÀí.xmind
Binary files differ
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -296,7 +296,7 @@
                    return o2.getPriority() - o1.getPriority();
                }
            });
            Integer backpack = agvService.getBackpack(agv);
            Integer backpack = agvService.getBackpack(agvId);
            if (taskList.size() > backpack) {
                taskList = taskList.subList(0, backpack);
            }
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,7 +10,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Objects;
// man_segment: start_time, end_time
/**
@@ -29,6 +30,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 +45,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 +63,48 @@
            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);
            int countRemainingBackpack = segmentService.countRemainingBackpack(currSeg.getTravelId(), agvId);
            if (countRemainingBackpack >= backpack) {
                return false;
            }
            // 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;
            }
            // timeout
            return (now - preEndTime) < PLACE_DELAY_MS;
        }
        return false;
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/SegmentMapper.java
@@ -10,4 +10,6 @@
    List<String> getGroupNo(@Param("state")String state, @Param("agvId")Long agvId, @Param("groupNo")String groupNo);
    int countRemainingBackpack(@Param("travelId") Long travelId, @Param("agvId") Long agvId);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java
@@ -38,7 +38,7 @@
    List<VehicleDto> getVehicleDtoList(List<String> noIncluded);
    Integer getBackpack(Agv agv);
    Integer getBackpack(Long agvId);
    Agv findByPosition(Long codeId);
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
@@ -28,4 +28,6 @@
    Segment getCurrRunningSeg(Long agvId, Long codeId);
    int countRemainingBackpack(Long travelId, Long agvId);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -266,11 +266,14 @@
    }
    @Override
    public Integer getBackpack(Agv agv) {
    public Integer getBackpack(Long agvId) {
        if (null == agvId) {
            return 0;
        }
//        if (null != agv.getStage()) {
//            return agv.getStage();
//        }
        AgvModel agvModel = agvModelService.getByAgvId(agv.getId());
        AgvModel agvModel = agvModelService.getByAgvId(agvId);
        assert null != agvModel;
        return agvModel.getBackpack();
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
@@ -163,4 +163,9 @@
        return segments.stream().findFirst().orElse(null);
    }
    @Override
    public int countRemainingBackpack(Long travelId, Long agvId) {
        return this.baseMapper.countRemainingBackpack(agvId, travelId);
    }
}
zy-acs-manager/src/main/resources/mapper/manager/SegmentMapper.xml
@@ -23,6 +23,22 @@
        </where>
    </sql>
    <select id="countRemainingBackpack" resultType="int">
        SELECT
            COUNT(DISTINCT backpack)
        FROM man_segment
        WHERE 1=1
        AND agv_id = #{agvId}
        <if test="travelId != null">
            AND travel_id = #{travelId}
        </if>
        AND deleted = 0
        AND status = 1
        AND backpack IS NOT NULL
        AND backpack > 0
        AND state != 'FINISH'
    </select>
    <select id="getGroupNo" resultType="java.lang.String">
        SELECT group_id
        FROM (
zy-acs-manager/src/main/resources/mapper/manager/StaMapper.xml
@@ -9,8 +9,15 @@
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND (capacity - occ_cnt - rsv_in_cnt) >= #{qty}
          AND (capacity - rsv_in_cnt) >= #{qty}
    </update>
<!--      UPDATE man_sta
        SET rsv_in_cnt = rsv_in_cnt + #{qty},
            update_time = NOW()
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND (capacity - occ_cnt - rsv_in_cnt) >= #{qty}-->
    <update id="releaseReserveIn">
        UPDATE man_sta
@@ -25,13 +32,20 @@
    <update id="confirmReserveIn">
        UPDATE man_sta
        SET rsv_in_cnt = rsv_in_cnt - #{qty},
            occ_cnt = occ_cnt + #{qty},
            update_time = NOW()
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND rsv_in_cnt >= #{qty}
    </update>
<!--     UPDATE man_sta
        SET rsv_in_cnt = rsv_in_cnt - #{qty},
            occ_cnt = occ_cnt + #{qty},
            update_time = NOW()
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND rsv_in_cnt >= #{qty}-->
    <update id="tryReserveOut">
        UPDATE man_sta
@@ -40,8 +54,15 @@
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND (occ_cnt - rsv_out_cnt) >= #{qty}
        AND (capacity - rsv_out_cnt) >= #{qty}
    </update>
<!--      UPDATE man_sta
        SET rsv_out_cnt = rsv_out_cnt + #{qty},
            update_time = NOW()
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND (occ_cnt - rsv_out_cnt) >= #{qty}-->
    <update id="releaseReserveOut">
        UPDATE man_sta
@@ -56,14 +77,21 @@
    <update id="confirmReserveOut">
        UPDATE man_sta
        SET rsv_out_cnt = rsv_out_cnt - #{qty},
            update_time = NOW()
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND rsv_out_cnt >= #{qty}
    </update>
<!--     UPDATE man_sta
        SET rsv_out_cnt = rsv_out_cnt - #{qty},
            occ_cnt = occ_cnt - #{qty},
            update_time = NOW()
        WHERE id = #{staId}
        AND deleted = 0
        AND status = 1
        AND rsv_out_cnt >= #{qty}
        AND occ_cnt >= #{qty}
    </update>
        AND occ_cnt >= #{qty}-->
    <select id="selectAvailableOutSta" resultType="com.zy.acs.manager.manager.entity.Sta">
        SELECT *
@@ -71,8 +99,14 @@
        WHERE 1=1
        AND deleted = 0
        AND status = 1
        AND (IFNULL(occ_cnt, 0) - IFNULL(rsv_out_cnt, 0)) >= #{minAvailableQty}
        AND (IFNULL(capacity, 0) - IFNULL(rsv_out_cnt, 0)) >= #{minAvailableQty}
    </select>
<!--            SELECT *
        FROM man_sta
        WHERE 1=1
        AND deleted = 0
        AND status = 1
        AND (IFNULL(occ_cnt, 0) - IFNULL(rsv_out_cnt, 0)) >= #{minAvailableQty}-->
    <select id="selectAvailableInSta" resultType="com.zy.acs.manager.manager.entity.Sta">
        SELECT *
@@ -80,8 +114,14 @@
        WHERE 1=1
        AND deleted = 0
        AND status = 1
        AND (IFNULL(capacity, 0) - IFNULL(occ_cnt, 0) - IFNULL(rsv_in_cnt, 0)) >= #{minAvailableQty}
        AND (IFNULL(capacity, 0) - IFNULL(rsv_in_cnt, 0)) >= #{minAvailableQty}
    </select>
<!--         SELECT *
        FROM man_sta
        WHERE 1=1
        AND deleted = 0
        AND status = 1
        AND (IFNULL(capacity, 0) - IFNULL(occ_cnt, 0) - IFNULL(rsv_in_cnt, 0)) >= #{minAvailableQty}-->
    <!-- å…³è”查询sql -->
    <sql id="selectSql">